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

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

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

class MyClass:
  Property1 = 1
  Property2 = 2

print MyClass.Property1 # 1
mc = MyClass()
print mc.Property1 # 1

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

4b9b3361

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