Подтвердить что ты не робот

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

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

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

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

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

class B:
    name = 'B'

__dict__ пуст.

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

4b9b3361

Ответ 1

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

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

Ответ 2

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__