2013-02-28 14 views
6

W poniższym przykładzie atrybut x jest dostępne z gniazd obiektu chociaż x jest obecny w __dict__ (nie jest to typowy lub prawdopodobnie przydatna sprawa, ale jestem ciekawy):Dostęp do atrybutów w Pythonie: pierwsze automaty, a następnie __dict__?

>>> class C(object): 
...  __slots__ = 'x' 
...  
>>> class D(C): 
...  pass 
... 
>>> obj = D() 
>>> obj.x = 'Stored in slots' 
>>> obj.__dict__ 
{} 
>>> obj.__dict__['x'] = 'stored in __dict__' 
>>> obj.x 
'Stored in slots' 

Czy ta kolejność dostępu (w pierwszej kolejności) udokumentowane zachowanie? lub po prostu szczegół implementacji?

Odpowiedz

10

Tak, obiekt __dict__ jest wyświetlany tylko po zapoznaniu się z deskryptorami danych. Atrybuty danych są zaimplementowane jako atrybuty danych.

Patrz Invoking descriptors:

Na przykład wiązania, pierwszeństwo deskryptora wywołania zależy od tego, które metody są zdefiniowane deskryptora. Deskryptor może definiować dowolną kombinację __get__(), i . Jeśli nie zdefiniuje ona __get__(), wówczas dostęp do atrybutu zwróci obiekt deskryptora, chyba że w słowniku instancji obiektu znajduje się wartość. Jeśli deskryptor definiuje __set__() i/lub __delete__(), jest to deskryptor danych; jeśli nie definiuje żadnego, jest to deskryptor niebędący deskryptorem danych. Zwykle deskryptory danych definiują zarówno __get__() i __set__(), podczas gdy deskryptory danych nie mają tylko metody __get__(). Deskryptory danych z ustawieniami __set__() i __get__() zawsze zastępują redefinicję w słowniku instancji. Natomiast deskryptory niebędące deskryptorami danych mogą być nadpisywane przez instancje.

i z tej samej strony, section on slots:

__slots__ są realizowane na poziomie klasy, tworząc deskryptorów (wykonawcze deskryptorów) dla każdej nazwy zmiennych. W rezultacie atrybuty klas nie mogą być używane do ustawiania wartości domyślnych dla zmiennych instancji zdefiniowanych przez __slots__; w przeciwnym razie atrybut klasy nadpisze przypisanie deskryptora.

+0

wierzę, to należy również cytowane (z deskryptorów [wykonawczego] (http://docs.python.org/2/reference/datamodel.html#implementing-descriptors)): „deskryptor może być w żadnym słownika klasy właściciela lub w słowniku klasy dla jednego z rodziców ". –

+1

@PavelAnossov: Nie jestem pewien, co to może dodać do zrozumienia automatów. Atrybuty szczeliny są implementowane jako deskryptory na klasie, a deskryptory danych pojawiają się przed wartościami "__dict__". To wystarczy, by udokumentować to zachowanie, nieprawdaż? –

+0

@PavelAnossov: Tak, czasami ludzie są zdezorientowani co do tego, gdzie są wyświetlane deskryptory, ale nie jest to tutaj kwestia. –

Powiązane problemy