- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
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/
我是一名优秀的程序员,十分优秀!