![](/img/trans.png)
[英]TypeError 'x' object has no attribute '__getitem__'
[英]X.__getitem__(1) vs type(X).__getitem__(X, 1)
class C:
data = 'spam'
def __getattr__(self, name):
print('getattr:', name)
return getattr(self.data, name)
X = C()
X.__getitem__(1) // <-- works!
type(X).__getitem__(X, 1) // <-- AttributeError: type object 'C' has no attribute '__getitem__'
既然type(X).__getitem__(X, 1)
在类 C 中找不到__getitem__
方法,难道不应该调用__getattr__(self, name)
函数吗?
X.__getitem__(1)
在实例和类中找不到__getitem__
所以它调用__getattr__(self, name)
。
为什么一个有效,一个无效? 我读到特殊方法查找会像X[1]
一样跳过__getattr__
函数(如果隐式调用?),但是,在这种情况下我明确调用它。
特殊方法查找文档的最后一部分显示了绕过__getattribute__
时的异常。
根据使用__len__
方法的示例(下面复制),您的代码中的type(X).__getitem__
将从元类中调用__getattribute__
,但您尚未定义它。
>>> class Meta(type):
... def __getattribute__(*args):
... print("Metaclass getattribute invoked")
... return type.__getattribute__(*args)
...
>>> class C(object, metaclass=Meta):
... def __len__(self):
... return 10
... def __getattribute__(*args):
... print("Class getattribute invoked")
... return object.__getattribute__(*args)
...
>>> c = C()
>>> c.__len__() # Explicit lookup via instance
Class getattribute invoked
10
>>> type(c).__len__(c) # Explicit lookup via type
Metaclass getattribute invoked
10
>>> len(c) # Implicit lookup
10
使用此信息,可以解释观察到的行为:
X.__getitem__(1) # <-- works!
调用类C
__getattribute__
以查找__getitem__
,它返回绑定到字符串"spam"
的__getitem__
。 当用参数 1 调用时,返回位置 1 的字母p
。
但:
type(X).__getitem__(X, 1)
__getattribute__
来自C
元类将被调用,但它没有在那里定义。 结果是AttributeError
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.