2017-01-04 7 views
0

私の質問:インデックス作成操作で__getattr__が呼び出されないのはなぜですか?

つまり、私はA[...]を提供するために、クラスA__getattr__を使用することはできません、__getattr__は、インデックス運用のために呼び出されていないようです。これには理由がありますか?または、__getattr__A__getitem__,__setitem__などを明示的に定義する必要なく、その機能を提供できるようにする方法ですか?

最小例:

のは、私は2つのほとんど同一のクラス、ExplicitImplicitを定義しましょう。それぞれは開始時に少しのリストself._arrを作成し、それぞれはにすべての属性要求を渡す__getattr__を定義します。唯一の違いは、Explicit__getitem__を定義していることです(これをself._arrに渡すだけです)。

# Passes all attribute requests on to a list it contains 
class Explicit(): 
    def __init__(self): 
     self._arr=[1,2,3,4] 
    def __getattr__(self,attr): 
     print('called __getattr_') 
     return getattr(self._arr,attr) 
    def __getitem__(self,item): 
     return self._arr[item] 

# Same as above but __getitem__ not defined 
class Implicit(): 
    def __init__(self): 
     self._arr=[1,2,3,4] 
    def __getattr__(self,attr): 
     print('called __getattr_') 
     return getattr(self._arr,attr) 

これは期待通りに動作します:

>>> e=Explicit() 
>>> print(e.copy()) 
called __getattr_ 
[1, 2, 3, 4] 
>>> print(hasattr(e,'__getitem__')) 
True 
>>> print(e[0]) 
1 

しかし、これにはない:

>>> i=Implicit() 
>>> print(i.copy()) 
called __getattr_ 
[1, 2, 3, 4] 
>>> print(hasattr(i,'__getitem__')) 
called __getattr_ 
True 
>>> print(i.__getitem__(0)) 
called __getattr_ 
1 
>>> print(i[0]) 
TypeError: 'Implicit' object does not support indexing 
+6

これがPythonの設計方法です。 '__getattr__'は属性アクセスに使用され、' __getitem__'はインデックスアクセスに使用されます。それぞれには特定の役割があります。私は質問が何であるかわからない。 – 3Doubloons

+1

[この回答](http://stackoverflow.com/a/10376655/2096752)それを説明します。 – shx2

+2

'd = {'keys':0}'この場合、 'd.keys'と' d ['keys'] 'は非常に異なるものです – 3Doubloons

答えて

1

Pythonは__getattr__バイパス、__getattribute__、およびインスタンスの辞書を "特別な" 方法について見上げたときに言語力学を実装する。 (ほとんどの場合、名前の両側に2つのアンダースコアを持つ特殊なメソッドがあります)。がi.__getitem__(0)を呼び出すと、i.__getattr__('__getitem__')(0)が呼び出されることになり、そのようなことは起こりませんでした。

+1

探している人のために、上記の@ shx2のコメントは、[これに関する参考文献を持つ質問](http://stackoverflow.com/a/10376655/2096752)へのリンクです。 –

関連する問題