假设:
In [37]: class A:
....: f = 1
....:
In [38]: class B(A):
....: pass
....:
In [39]: getattr(B, 'f')
Out[39]: 1
好的,要么调用super还是抓取mro?
In [40]: getattr(A, 'f')
Out[40]: 1
这是预期的。
In [41]: object.__getattribute__(A, 'f')
Out[41]: 1
In [42]: object.__getattribute__(B, 'f')
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-42-de76df798d1d> in <module>()
----> 1 object.__getattribute__(B, 'f')
AttributeError: 'type' object has no attribute 'f'
什么是getattribute没有做那个getattr呢?
In [43]: type.__getattribute__(B, 'f')
Out[43]: 1
什么? type.__getattribute__
调用超级但object
的版本没有?
In [44]: type.__getattribute__(A, 'f')
Out[44]: 1
答案 0 :(得分:6)
您正在类上直接操作。 object.__getattribute__
仅在A
和B
的实例上使用。这是因为special methods are looked up on the type;对于实例,类型是类。
对于类,类型为.. type
:
>>> class A:
... f = 1
...
>>> class B(A):
... pass
...
>>> type(B)
<class 'type'>
因此使用了type.__getattribute__
:
>>> type.__getattribute__(B, 'f')
1
和object.__getattribute__
在实例上运行良好:
>>> object.__getattribute__(B(), 'f')
1
对于实例,首先在类上查找属性(在data descriptors的情况下),然后在实例上,然后如果实例没有该属性,则在MRO中搜索类层次结构订购。这是object.__getattribute__
的工作。因此,object.__getattribute__
会查看self
中对象的第一个参数(例如type(self).__mro__
,即实例对象),和。
对于类,在类本身及其所有基础上查找属性; type.__getattribute__
直接查看self.__mro__
这些内容; self
在这里是一个类对象。
如果您对{em>类使用object.__getattribute__
,那么f
上没有B
属性,而且{{ 1}} f
中的任何位置。如果您使用type(B).__mro__
,type.__getattribute__
是A
的成员,那么B.__mro__
就会在那里找到:
f