繁体   English   中英

X.__getitem__(1) vs type(X).__getitem__(X, 1)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM