2012-07-06 9 views
9

Al intentar envolver objetos arbitrarios, encontré un problema con diccionarios y listas. Investigando, logré encontrar un código simple cuyo comportamiento simplemente no entiendo. Espero que algunos de ustedes me puede decir lo que está pasando:¿Por qué __getattribute__ no se invoca en una invocación implícita de __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__' 

Respuesta

12

magia __methods__() se trata de forma especial: Se les asigna internamente a "slots" en la estructura del tipo de datos para acelerar su consulta, y que son solo busqué en estas máquinas tragamonedas. Si la ranura está vacía, recibirá el mensaje de error que recibió.

Consulte Special method lookup for new-style classes en la documentación para obtener más información. Extracto:

Además de pasar por cualquier instancia de atributos en el interés de la corrección, la implícita de búsqueda método especial, también es posible no pasa por el método aún de metaclase del objeto __getattribute__().

[...]

Sin pasar por la maquinaria __getattribute__() de esta manera proporciona un amplio margen para optimizaciones de velocidad dentro de la intérprete, a costa de una cierta flexibilidad en el manejo de métodos especiales (el método especial se debe ajustar en la clase objeto en sí mismo para ser invocado constantemente por el intérprete).

Cuestiones relacionadas