- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
给定:
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__
仅在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
在这里是一个类对象。
如果您对类 使用object.__getattribute__
,则B
上没有f
属性直接,type(B).__mro__
中的任何地方都没有f
。如果您使用 type.__getattribute__
,A
是 B.__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/
给定: In [37]: class A: ....: f = 1 ....: In [38]: class B(A): ....: pass ....: In
class Shadow(object): pass class Test(object): a = 1 b = 2 _shadow = Shadow() de
我想在调用特定方法之前调用带有参数的函数的包装方法。所以我想我必须重写 __getattribute__ 方法。 以下是代码示例: def wrapper(func): return func
class test(): name = 'arthur' def __getattribute__(self, value): return super().__getattribu
根据 python 描述符指南 https://docs.python.org/howto/descriptor.html 新样式类中的方法对象是使用描述符实现的,以避免在属性查找中对它们进行特殊封装
这个对我来说似乎有点棘手。前段时间我已经设法用类似的东西覆盖实例的方法: def my_method(self, attr): pass instancemethod = type(self.
考虑以下几点: class A(object): def __init__(self): print 'Hello!' def foo(self): p
我想覆盖对类中一个变量的访问,但正常返回所有其他变量。如何使用 __getattribute__ 完成此操作? 我尝试了以下操作(这也应该说明我正在尝试做的事情)但我得到一个递归错误: class D
我尝试重写数据类中的__getattribute__特殊方法,以获得属性的格式化版本。 @dataclass class _BaseRouteRegistry: VERSION = '1'
我尝试重写数据类中的__getattribute__特殊方法,以获得属性的格式化版本。 @dataclass class _BaseRouteRegistry: VERSION = '1'
我有以下代码: #-*-coding:utf-8-*- class A(object): def __init__(self, x): self.x = x def _
为了更好地理解这个问题,这里有一个例子: class Parent: def __getattribute__(self, attr): print('ha!')
我有一个包含成员对象的类。我想像调用容器类的方法一样调用成员的方法。 以下示例说明了(但在不同的上下文中)我想要做的事情。 假设我们有两个类代表两种不同类型的产品:玩具和鞋子。每个类都有两个方法,比如
我阅读了一些关于 python 的对象属性查找的内容(此处:https://blog.ionelmc.ro/2015/02/09/understanding-python-metaclasses/#o
class B(object): """new style class""" def __getattribute__(self, name): print '__getatt
这是从 Python 2.7.12 文档(3.4.12. 新型类的特殊方法查找¶)中检索到的代码片段: In addition to bypassing any instance attributes
如果这个问题有重复,抱歉,我没有找到它,如果有人找到,我会删除这个问题。 我有这个简单的 python 类: class NothingSpecial: @classmethod
我有以下类(class): class StrLogger(str): def __init__(self, *args): self._log_ = [] s
似乎 __getattribute__ 只有两个参数 (self, name)。 然而,在实际代码中,我拦截的方法实际上是带参数的。 无论如何都可以访问这些参数吗? 谢谢, 查理 最佳答案 __get
Python in a Nutshell 描述: 从类中获取属性时的查找过程,例如cls.name(参见 Why are the lookup procedures for getting an at
我是一名优秀的程序员,十分优秀!