gpt4 book ai didi

python - 为什么元类 __getattribute__ 在这里调用?

转载 作者:太空宇宙 更新时间:2023-11-03 15:00:14 26 4
gpt4 key购买 nike

这是从 Python 2.7.12 文档(3.4.12. 新型类的特殊方法查找¶)中检索到的代码片段:

In addition to bypassing any instance attributes in the interest of correctness, implicit special method lookup generally also bypasses the __getattribute__() method even of the object’s metaclass:

>>> 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

我的问题是,为什么在执行 type(c).__len__(c) 时会调用元类 __getattribute__

因为 type(c) 产生 C,这个语句可以重写为 C.__len__(c)C.__len__是类C中定义的未绑定(bind)方法,在C.__dict__中可以找到,为什么是Meta 参与查找?

最佳答案

引自同一文档 3.4.2.1。新式类的更多属性访问:

object.__getattribute__(self, name)

Called unconditionally to implement attribute accesses for instances of the class. ...

C是元类Meta的一个实例,所以Meta.__getattribute__C.__len__时被调用被访问,即使后者可以在 C.__dict__ 中找到。

事实上,访问C.__dict__也是一种属性访问,因此Meta.__getattribute__仍然会被调用。

关于python - 为什么元类 __getattribute__ 在这里调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38608223/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com