2010-07-05 5 views
12

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

class MyClass: 
    Property1 = 1 
    Property2 = 2 

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

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

+3

Так как переменные класса работают? – SilentGhost

+1

@SilentGhost: Да, переменные класса Python работают таким образом, но это поведение не требуется, и я не могу найти объяснения. – Philipp

ответ

27

Код

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

+0

+1 для подробного описания механизма, но это также прекрасная возможность явно указать фундаментальное свойство Python: почти все или действует как объект, в том числе определения классов. –

+0

Спасибо, это имеет смысл. – Andre

+0

«он выглядит в типе родительского класса' mc', должен читать «он выглядит в типе« класса mc », нет? – EoghanM