gpt4 book ai didi

python - type.__getattribute__ 和 object.__getattribute__ 有什么区别?

转载 作者:太空狗 更新时间:2023-10-30 02:31:00 25 4
gpt4 key购买 nike

给定:

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__ 调用 super 但 object 的版本没有?

In [44]: type.__getattribute__(A, 'f')
Out[44]: 1

最佳答案

直接在类里面操作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 在这里是一个类对象。

如果您对 使用object.__getattribute__,则B 上没有f 属性直接type(B).__mro__ 中的任何地方都没有f。如果您使用 type.__getattribute__AB.__mro__ 的成员,因此可以在那里找到 f:

>>> type(B).__mro__
(<class 'type'>, <class 'object'>)
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)

关于python - type.__getattribute__ 和 object.__getattribute__ 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24150894/

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