请注意,此问题已在评论中回答
我注意到一些异常处理行为__getattribute__
,__getattr__
我在文档或此处的其他帖子中找不到。
考虑这个类A
。如果 的实例A
具有属性 ,则None
访问该属性会引发AttributeError
.
class A:
def __getattribute__(self, item):
value = object.__getattribute__(self, item)
if value is None:
raise AttributeError('in __getattribute__')
return value
def __init__(self, a=None):
self.a = a
A(1).a # 1
A().a # raises AttributeError('in __getattribute__')
现在,文档说__getattribute__
无条件调用以实现类实例的属性访问。如果该类还定义了
__getattr__()
,则不会调用后者,除非__getattribute__()
显式调用它或引发AttributeError
.
由此,我猜想任何AttributeError
加注__getattribute__
都会被捕获,并且该过程会延迟到__getattr__
,这样AttributeError('in __getattribute__')
调用者就永远不会看到。
令我惊讶的是,不仅看到了错误,而且AttributeError
引发的 onA().a
也是 in 中的那个__getattribute__
,就好像__getattr__
从未被调用过一样。那是除非 __getattr__
提出自己的
def __getattr__(self, item):
raise AttributeError('in __getattr__')
在这种情况下,我们看到AttributeError('in __getattr__')
了提升。
这里有什么规则?如果不是AttributeError('in __getattribute__')
我提出了in 的一些子类Oops
,它们是否适用?AttributeError
__getattribute__