请注意,此问题已在评论中回答
我注意到一些异常处理行为__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__