为什么不调用 __getattr__ 进行索引操作?
Why is __getattr__ not called for indexing operations?
我的问题:
似乎没有调用 __getattr__
进行索引操作,即我不能在 class A
上使用 __getattr__
来提供 A[...]
.是否有一个原因?或者一种绕过它的方法,这样 __getattr__
就可以提供该功能,而不必在 A
?
上显式定义 __getitem__
、__setitem__
等
最小示例:
假设我定义了两个几乎相同的 classes,Explicit
和 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
Python 在查找 "special" 实现语言机制的方法时绕过 __getattr__
、__getattribute__
和实例字典。 (在大多数情况下,特殊方法是名称两边各有两个下划线的方法。)如果您希望 i[0]
调用 i.__getitem__(0)
,而后者又会调用 i.__getattr__('__getitem__')(0)
,那就是为什么那没有发生。
我的问题:
似乎没有调用 __getattr__
进行索引操作,即我不能在 class A
上使用 __getattr__
来提供 A[...]
.是否有一个原因?或者一种绕过它的方法,这样 __getattr__
就可以提供该功能,而不必在 A
?
__getitem__
、__setitem__
等
最小示例:
假设我定义了两个几乎相同的 classes,Explicit
和 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
Python 在查找 "special" 实现语言机制的方法时绕过 __getattr__
、__getattribute__
和实例字典。 (在大多数情况下,特殊方法是名称两边各有两个下划线的方法。)如果您希望 i[0]
调用 i.__getitem__(0)
,而后者又会调用 i.__getattr__('__getitem__')(0)
,那就是为什么那没有发生。