Почему находится моя переменная экземпляра не в __ dict __?

Я думаю, разница в шаблонах использования.

Я предпочел бы .on над .click, потому что предыдущий может использовать меньше памяти и работать для динамически добавленных элементов.

Рассмотрим следующий html:

<html>
    <button id="add">Add new</button>
    <div id="container">
        <button class="alert">alert!</button>
    </div>
</html>

, где мы добавляем новые кнопки через

$("button#add").click(function() {
    var html = "<button class='alert'>Alert!</button>";
    $("button.alert:last").parent().append(html);
});

и хотим «Alert!» чтобы показать предупреждение. Для этого мы можем использовать «щелчок» или «вкл».


Когда мы используем click

$("button.alert").click(function() {
    alert(1);
});

с указанным выше, обработчик раздельный создается для каждого отдельного элемента , который соответствует селектору. Это означает, что

  1. многие совпадающие элементы создавали бы много одинаковых обработчиков и, таким образом, увеличивали размер памяти
  2. , динамически добавленные элементы не будут иметь обработчик, т. Е. В приведенном выше html новом добавлено "Alert!" кнопки не будут работать, если вы не переустановите обработчик.

Когда мы используем .on

$("div#container").on('click', 'button.alert', function() {
    alert(1);
});

с указанным выше, single для всех элементов , которые соответствуют вашему селектору, включая динамически созданные.


... еще одна причина использования .on

Как прокомментировал Adrien ниже, другой причиной использования .on являются события с именами.

Если вы добавили обработчик с .on("click", handler), вы обычно удаляете его с помощью .off("click", handler), который удалит этот обработчик. Очевидно, что это работает, только если у вас есть ссылка на функцию, так что, если вы этого не сделаете? Вы используете пространства имен:

$("#element").on("click.someNamespace", function() { console.log("anonymous!"); });

с отключением через

$("#element").off("click.someNamespace");
34
задан Nicholas Knight 12 August 2011 в 06:33
поделиться

2 ответа

B.name атрибут класса, не атрибут экземпляра. Это обнаруживается в B.__dict__, но не в b = B(); b.__dict__.

различие затенено несколько, потому что при доступе к атрибуту на экземпляре класс dict является нейтрализацией. Таким образом в вышеупомянутом примере, b.name даст Вам значение B.name.

44
ответ дан Carl Meyer 27 November 2019 в 16:53
поделиться
class A:
    def _ _init_ _(self):
        self.name = 'A'
a = A()

Создает атрибут на экземпляре объекта типа A, и это может поэтому быть найдено в: a.__dict__

class B:
    name = 'B'
b = B()

Создает атрибут на классе B, и атрибут может быть найден в B.__dict__ альтернативно, если у Вас есть экземпляр b типа B, Вы видите атрибуты уровня класса в b.__class__.__dict__

12
ответ дан Tendayi Mawushe 27 November 2019 в 16:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: