2010-07-05 16 views
12

Jestem stosunkowo nowy w Pythonie i był nadzieją, ktoś mógłby wyjaśnić mi co następuje:właściwości statyczne w Pythonie

class MyClass: 
    Property1 = 1 
    Property2 = 2 

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

Dlaczego mam dostępu Property1 zarówno statycznie i przez instancji MojaKlasa?

+3

Bo tak działają zmienne klasy? – SilentGhost

+1

@SilentGhost: Tak, zmienne klasy Python działają w ten sposób, ale to zachowanie nie jest wymagane i nie jestem w stanie znaleźć dla niego wyjaśnienia. – Philipp

Odpowiedz

27

Kod

class MyClass: 
    Property1 = 1 

tworzy klasę MyClass który ma dict:

>>> MyClass.__dict__ 
{'Property1': 1, '__doc__': None, '__module__': '__main__'} 

zauważy parę klucz-wartość 'Property1': 1. Po wypowiedzeniu MyClass.Property1, Python sprawdza w dyktafonie MyClass.__dict__ klucz Property1 i jeśli go znajdzie, zwraca powiązaną wartość 1.

>>> MyClass.Property1 
1 

Po utworzeniu instancji klasy,

>>> mc = MyClass() 

dict dla instancji jest tworzona również:

>>> mc.__dict__ 
{} 

Wskazówka ten dict jest pusty. Kiedy mówisz mc.Property1, Python najpierw szuka w mc.__dict__ dla klucza 'Property1'. Ponieważ jej tam nie ma, wygląda to w dyktafonie klasy mc, czyli MyClass.__dict__.

>>> mc.Property1 
1 

Zauważ, że jest znacznie więcej do historii Python attribute access. (Nie wspomniałem na przykład o ważnych zasadach dotyczących deskryptorów.) Ale powyższe zawiera zasadę dla większości typowych przypadków dostępu do atrybutów.

+0

+1 dla szczegółowego opisu mechanizmu, ale jest to również doskonała okazja do jawnego określenia podstawowej własności Pythona: Prawie wszystko jest lub działa bardzo podobnie do obiektu, w tym definicji klas. –

+0

Dzięki, to ma więcej sensu. – Andre

+0

"Wygląda w dyktarze klasy macierzystej mc" powinien przeczytać "wygląda w dyktafonie klasy mc", nie? – EoghanM

Powiązane problemy