我的问题:
看起来__getattr__
不调用索引操作,即我不能使用__getattr__
在课堂上A
提供A[...]
。是否有一个原因?或者一种绕过它的方法__getattr__
可以提供该功能而无需显式定义__getitem__
, __setitem__
等A
?
最小示例:
假设我定义了两个几乎相同的类,Explicit
and Implicit
。每个人都会创建一个小列表self._arr
在启动时,每个都定义了一个__getattr__
只是将所有属性请求传递给self._arr
。唯一的区别是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