2012-07-06 9 views
9

Rasgele nesneleri sarmaya çalışırken, sözlükler ve listelerle ilgili bir sorunla karşılaştım. Araştırmak, davranışlarımı basitçe anlamadığım basit bir kod parçası bulmayı başardım.__getattribute__ neden gizli __getitem __-invocation çağrılmıyor?

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

cevap

12

Magic __methods__() konudur:: Bazılarınızın neler olduğunu bana söyleyebilir umut Onlar içten onların göz-up hızlandırmak için tip veri yapısında için "yuva" atanır ve bunlar sadece bu yuvalara baktı. Yuva boşsa, aldığınız hata mesajını alırsınız. Daha fazla bilgi için belgede Special method lookup for new-style classes numaralı belgeye bakın. Alıntı: herhangi bir durum atlayarak ek olarak

doğruluğu yararına özellikleri, kapalı özel bir yöntem arama genellikle ayrıca da nesnenin metaclass __getattribute__() yöntemi atlar. Bu şekilde __getattribute__() makine atlama

[...]

özel yöntemlerin ayrıca uygulama sırasında esneklik pahasına, tercüman içinde hız optimizasyonları için önemli bir potansiyel sağlayacak (özel yöntem sınıfı ayarlanmalıdır Tercüman tarafından sürekli olarak çağrılmak için kendisini nesneye.