Код
class MyClass:
Property1 = 1
создает класс MyClass
который имеет Dict:
>>> MyClass.__dict__
{'Property1': 1, '__doc__': None, '__module__': '__main__'}
Примечание ключ-значение пары 'Property1': 1
. Когда вы говорите MyClass.Property1
, Python смотрит в dict MyClass.__dict__
за ключ Property1
, и если он находит его, возвращается связанное значение 1
.
>>> MyClass.Property1
1
При создании экземпляра класса,
>>> mc = MyClass()
ДИКТ для экземпляра также создано:
>>> mc.__dict__
{}
Обратите внимание, этот ДИКТ пуст. Когда вы говорите mc.Property1
, Python сначала смотрит в mc.__dict__
для ключа 'Property1'
. Так как он не находит его там, он выглядит в типе mc
, то есть MyClass.__dict__
.
>>> mc.Property1
1
Обратите внимание, что есть намного больше к истории Python attribute access. (Например, я не упомянул о важных правилах, касающихся дескрипторов). Но вышеприведенное правило выдает правило для большинства распространенных случаев доступа к атрибутам.
Так как переменные класса работают? – SilentGhost
@SilentGhost: Да, переменные класса Python работают таким образом, но это поведение не требуется, и я не могу найти объяснения. – Philipp