gpt4 book ai didi

python - __getattribute__ 什么时候不参与属性查找?

转载 作者:太空宇宙 更新时间:2023-11-03 11:23:31 25 4
gpt4 key购买 nike

考虑以下几点:

class A(object):
def __init__(self):
print 'Hello!'

def foo(self):
print 'Foo!'

def __getattribute__(self, att):
raise AttributeError()

a = A() # Works, prints "Hello!"
a.foo() # throws AttributeError as expected

__getattribute__ 的实现显然使所有查找失败。我的问题:

  • 为什么仍然可以实例化一个对象?我原以为 __init__ 方法本身的查找也会失败。
  • 不受 __getattribute__ 约束的属性列表是什么?

最佳答案

The implementation of __getattribute__ obviously fails all lookups

假设所有普通查找都失败了。

既然 __getattribute__ 本身也是类的属性,那么它是如何首先被调用的呢?


属性指的是点后的任何名称。因此,要获取类实例的属性,当您尝试访问该属性(通过点引用)时,将无条件调用__getattribute__

但是魔法方法__init__ 是语言构造的一部分,因此不能直接调用(通过点引用),因为它们是作为语言的一部分实现的。

Why is it still possible to instantiate an object?

当你这样做时:

a = A()

__init__ 方法在幕后被调用,但不是通过普通的查找。语言处理这个。这同样适用于其他方法,例如 __setattr____delattr____getattribute__ 等。

但是如果你直接调用__init__:

a.__init__()

它会引发错误。嗯,这没有任何意义,因为类已经初始化了。

更巧妙的是,如果您尝试通过点引用从您的类实例访问 __getattribute__:

a.__getattribute__

它还会引发一个AttributeError;同一方法的语言调用尝试查找属性 __getattribute__,但因错误而失败。


What's the list of attributes that are not subject to __getattribute__?

总而言之,当您尝试通过点引用访问任何属性时,__getattribute__ 就会发挥作用。只要您不尝试显式调用魔术方法,就不会调用__getattribute__

关于python - __getattribute__ 什么时候不参与属性查找?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38235750/

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