python - __getattribute__ 如何获取值?

标签 python python-3.x function class built-in

class test():
  name = 'arthur'

  def __getattribute__(self, value):
    return super().__getattribute__(value)

x = test()
x.name

------------------------------------------
Output: 'arthur'

我试图理解__getattribute__的底层机制。我理解(希望)在这种情况下 super().__getattribute__(value) 会触及对象类。但是,object 实际上是如何从 test() 类中获取 name 值的呢?如果自己在类中编写代码,如何在避免递归的情况下使用 __getattribute__ 获取属性值?

正如我所说,我想了解底层机制,我知道这不是您通常处理事情的方式。

谢谢!

最佳答案

首先,__getattribute__是一个魔术方法(又名dunder方法/双下划线方法)。这是一个属性/属性访问器方法,即使属性/属性在类本身中可用,它也会拦截每个属性/属性访问。另一方面,仅当您正在访问的属性在类/实例中不存在时,才会调用 __getattr__ 魔术方法。无论如何...

还有一件更重要的事情需要注意,您可能已经知道,所有类都隐式或显式扩展/继承基 object 类。因此,您定义的任何类,默认父类都是内置的 object 类。正如您所问的,您很困惑:

I understand (hopefully) that super().__getattribute__(value) reaches out to the object class in this case. But how actually does object fetch the name value out of the test() class?

让我们先看一些基本示例:

class Foo:
    def __init__(self, name):
        self.name = name

    def __getattribute__(self, name):
        return super().__getattribute__(name)

相当于

class Foo(object):
    def __init__(self, name):
        self.name = name

    def __getattribute__(self, name):
        return object.__getattribute__(self, name)

所以,当你打电话时

object.__getattribute__(self, name)

您正在将上下文(类的实例)显式传递给父类(object)。因此父/对象类知道上下文并从传递的实例中获取属性。另一方面,当您调用时:

super().__getattribute__(name)

Python 为您设置上下文。所以,你可以想象这样的事情:

super(test, self).__getattribute__(name) # it's valid

但在这种情况下,它是隐式的,这就是 super() 调用知道在哪里查找属性的方式。值得一提的是,Python 的 super() 内置函数返回一个代理 object ,一个可以通过委托(delegate)调用基类方法的替代对象,并且 super() 可以接受两个参数(如您在前面的代码片段中所见),第一个是子类类型(在本例中为 test),第二个参数是一个对象,即该子类的实例 (test)。

Python 3 中,super(test, self) 调用相当于无参数 super() 调用。希望我已经澄清了您的困惑。您可以阅读更多关于 super() .

关于python - __getattribute__ 如何获取值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59328914/

相关文章:

python - 通过 python (paramiko) 的 SSH 错误 : "' _EllipticCurvePublicKey' object has no attribute 'verify' "

python - 如何使用 Tkinter 可视化时间序列数据?

python - 支持 python 2 和 3 : str, 字节或替代

python - 在早期的 Python 中重现 Python 3.3 __qualname__ 的效果

function - 从 VB6 中的函数返回用户定义的类型

python - 将参数传递到 AWS CLI 命令

python - 在 Python 中设置或更新字典条目代码模式

Python TypeError - 预期字节但在尝试创建签名时得到 'str'

scala - 在 Scala 中使用函数映射实例

function - 由于 NanoMatch 问题,Firestore 的 Firebase 功能失败