首先,__getattribute__ 是一种神奇的方法(又名dunder 方法/双下划线方法)。这是一个属性/属性访问器方法,即使属性/属性在类本身中可用,它也会拦截每个属性/属性访问。另一方面,__getattr__ 魔术方法仅在您访问的属性在类/实例中不存在时才被调用。总之……
还有一件更重要的事情需要注意,正如您可能已经知道的那样,所有类都隐式或显式地扩展/继承了基础 object 类。因此,您定义的任何类,默认父类都是内置的object 类。你问的一头雾水:
我了解(希望)super().__getattribute__(value) 到达
在这种情况下到 object 类。但实际上object
从test() 类中取出name 值?
让我们先看一些基本的例子:
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,一个可以通过委托调用基类方法的替代对象,而且super() 可以带两个参数(正如您在前面的代码中看到的那样) sn-p),第一个是子类类型(在本例中为test),第二个参数是一个对象,该子类的一个实例(test)。
在Python 3 中,super(test, self) 调用等效于无参数的super() 调用。希望我已经澄清了你的困惑。你可以阅读更多关于super()的信息。