gpt4 book ai didi

python - __getattribute__ 如何获取值?

转载 作者:太空宇宙 更新时间:2023-11-04 01:44:43 26 4
gpt4 key购买 nike

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/

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