Статические свойства в Python

Я относительно новичок в Python и надеялся, что кто-то может объяснить мне следующее:

class MyClass: Property1 = 1 Property2 = 2 print MyClass.Property1 # 1 mc = MyClass() print mc.Property1 # 1 

Почему я могу получить доступ к Property1 как статически, так и через экземпляр MyClass?

Код

 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 гораздо больше. (Например, я не упомянул о важных правилах, касающихся дескрипторов). Но вышеприведенное правило выдает правило для большинства распространенных случаев доступа к атрибутам.