9

任意のオブジェクトをラップしようとしているときに、辞書とリストに関する問題に遭遇しました。調べてみると、どうにかしてその動作が理解できない単純なコードを思いつきました。何が起こっているのか教えていただけると幸いです。

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

1 に答える 1

13

Magic__methods__()は特別に扱われます。それらは、検索を高速化するために型データ構造の「スロット」に内部的に割り当てられ、これらのスロットでのみ検索されます。スロットが空の場合は、エラー メッセージが表示されます。

詳細については、ドキュメントの新しいスタイル クラスの特別なメソッド ルックアップを参照してください。抜粋:

__getattribute__()正しさのためにインスタンス属性をバイパスすることに加えて、暗黙的な特殊メソッド検索は通常、オブジェクトのメタクラスのメソッドもバイパスします。

[…]

この方法で機構をバイパスする__getattribute__()と、インタープリター内で速度を最適化するための大きな範囲が提供されますが、特別なメソッドの処理の柔軟性がいくらか犠牲になります (インタープリターによって一貫して呼び出されるためには、クラス オブジェクト自体に特別なメソッドを設定する必要があります)。 .

于 2012-07-06T10:02:54.403 に答える