2012-07-06 20 views
9

Podczas próby owinięcia dowolnych obiektów natrafiłem na problem ze słownikami i listami. Po zbadaniu udało mi się wymyślić prosty kod, którego zachowanie po prostu nie rozumiem. Mam nadzieję, że niektórzy z was może mi powiedzieć, co się dzieje:Dlaczego funkcja __getattribute__ nie jest wywoływana w niejawnym wywołaniu __getitem __?

>>> class Cl(object): # simple class that prints (and suppresses) each attribute lookup 
... def __getattribute__(self, name): 
...  print 'Access:', name 
... 
>>> i = Cl() # instance of class 
>>> i.test # test that __getattribute__ override works 
Access: test 
>>> i.__getitem__ # test that it works for special functions, too 
Access: __getitem__ 
>>> i['foo'] # but why doesn't this work? 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'Cl' object has no attribute '__getitem__' 

Odpowiedz

12

Magia __methods__() są traktowane specjalnie: są wewnętrznie przypisane do „szczeliny” w strukturze typu danych w celu przyspieszenia ich Look-Up, i są tylko spojrzał w tych automatach. Jeśli gniazdo jest puste, otrzymujesz komunikat o błędzie, który masz.

Zobacz dokumentację Special method lookup for new-style classes w celu uzyskania dalszych szczegółów. Fragment:

Oprócz pominięciem jakichkolwiek atrybutów instancji w interesie poprawności, niejawna metoda specjalnego odnośnika zazwyczaj omija również metodę nawet metaklasą obiektu __getattribute__().

[...]

Omijanie maszyny w ten sposób __getattribute__() zapewnia znaczny zakres dla optymalizacji prędkości w tłumacza, kosztem pewnej elastyczności w obsłudze specjalnych metod (szczególna metoda musi być ustawiony na klasy sam obiekt, aby być konsekwentnie przywoływanym przez tłumacza).

Powiązane problemy