Почему моя переменная экземпляра отсутствует в __dict__? - PullRequest
33 голосов
/ 30 августа 2008

Если я создаю класс A следующим образом:

class A:
    def __init__(self):
        self.name = 'A'

Проверка элемента __dict__ выглядит как {'name': 'A'}

Если, однако, я создаю класс B:

class B:
    name = 'B'

__dict__ пусто.

В чем разница между ними, и почему name не появляется в B __dict__?

Ответы [ 2 ]

44 голосов
/ 30 августа 2008

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

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

12 голосов
/ 02 сентября 2008
class A:
    def _ _init_ _(self):
        self.name = 'A'
a = A()

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...