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 theobject
class in this case. But how actually doesobject
fetch thename
value out of thetest()
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/