Ответ 1
Код
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()
также создается dict для экземпляра:
>>> mc.__dict__
{}
Обратите внимание, что этот dict пуст. Когда вы говорите mc.Property1
, Python сначала смотрит в mc.__dict__
для ключа 'Property1'
. Так как он не находит его там, он выглядит в типе класса mc
, то есть MyClass.__dict__
.
>>> mc.Property1
1
Обратите внимание, что в истории доступ к атрибуту Python существует гораздо больше. (Например, я не упомянул о важных правилах, касающихся дескрипторов). Но вышеприведенное правило содержит правило для большинства распространенных случаев доступа к атрибутам.