type .__ getattribute__和object .__ getattribute__有什么区别?

时间:2014-06-10 21:10:47

标签: python getattr python-internals method-resolution-order

假设:

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

1 个答案:

答案 0 :(得分:6)

您正在上直接操作object.__getattribute__仅在AB的实例上使用。这是因为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