Почему __getattribute__ не вызывается при неявном вызове __getitem __-invocation?

При попытке обернуть произвольные объекты я столкнулся с проблемой со словарями и списками. Изучая, мне удалось найти простой кусок кода, поведение которого я просто не понимаю. Я надеюсь, что некоторые из вас расскажут мне, что происходит:

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

One Solution collect form web for “Почему __getattribute__ не вызывается при неявном вызове __getitem __-invocation?”

Магические __methods__() обрабатываются специально: они внутренне привязаны к слотам в структуре данных типа, чтобы ускорить их поиск, и они просматриваются только в этих слотах. Если слот пуст, вы получите сообщение об ошибке, которое вы получили.

Дополнительную информацию см. В специальном поиске методов для классов нового стиля в документации. Выдержка:

Помимо обхода любых атрибутов экземпляра в интересах правильности, неявный поиск специальных методов обычно также обходит метод __getattribute__() даже метакласса объекта.

[…]

В обход __getattribute__() таким образом обеспечивается значительная возможность для оптимизации скорости в интерпретаторе за счет некоторой гибкости при обработке специальных методов (специальный метод должен быть установлен на самом объекте класса, чтобы последовательно вызывать его переводчик).

Python - лучший язык программирования в мире.