私の質問:インデックス作成操作で__getattr__が呼び出されないのはなぜですか?
つまり、私はA[...]
を提供するために、クラスA
に__getattr__
を使用することはできません、__getattr__
は、インデックス運用のために呼び出されていないようです。これには理由がありますか?または、__getattr__
がA
に__getitem__
,__setitem__
などを明示的に定義する必要なく、その機能を提供できるようにする方法ですか?
最小例:
のは、私は2つのほとんど同一のクラス、Explicit
とImplicit
を定義しましょう。それぞれは開始時に少しのリスト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
これがPythonの設計方法です。 '__getattr__'は属性アクセスに使用され、' __getitem__'はインデックスアクセスに使用されます。それぞれには特定の役割があります。私は質問が何であるかわからない。 – 3Doubloons
[この回答](http://stackoverflow.com/a/10376655/2096752)それを説明します。 – shx2
'd = {'keys':0}'この場合、 'd.keys'と' d ['keys'] 'は非常に異なるものです – 3Doubloons