2012-07-06 15 views
9

Durante il tentativo di racchiudere oggetti arbitrari, ho trovato un problema con i dizionari e gli elenchi. Indagando, sono riuscito a inventarmi un semplice pezzo di codice il cui comportamento semplicemente non capisco. Spero che qualcuno di voi mi può dire cosa sta succedendo:Perché __getattribute__ non viene invocato in una chiamata __getitem __- implicita?

>>> 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__' 

risposta

12

Magia __methods__() vengono trattati in maniera particolare: Essi vengono assegnati internamente a "slot" nella struttura di tipo di dati per accelerare il loro look-up, e sono ho cercato solo in queste slot. Se lo slot è vuoto, ricevi il messaggio di errore che hai ricevuto.

Vedere Special method lookup for new-style classes nella documentazione per ulteriori dettagli. Estratto:

Oltre a bypassando qualsiasi istanza attributi nell'interesse della correttezza, implicita metodo speciale di ricerca generalmente bypassa anche il metodo ancora di meta-classe dell'oggetto __getattribute__().

[...]

Ignorando il macchinario __getattribute__() in questo modo fornisce un ampio margine di ottimizzazioni velocità comprese l'interprete, a costo di una certa flessibilità nella gestione dei metodi speciali (metodo speciale deve essere impostato sulla classe oggetto stesso per essere costantemente invocato dall'interprete).

Problemi correlati