覆盖__getattr__
应该没问题-__getattr__
只能作为最后的选择,即,如果实例中没有与名称匹配的属性。例如,如果您访问foo.bar
,则__getattr__
仅当foo
没有调用属性时才会被调用bar
。如果该属性是您不想处理的属性,请引发AttributeError
:
class Foo(object):
def __getattr__(self, name):
if some_predicate(name):
# ...
else:
# Default behavIoUr
raise AttributeError
但是,与不同__getattr__
,__getattribute__
首先会被调用(仅适用于新样式类,即从对象继承的类)。在这种情况下,您可以保留默认行为,如下所示:
class Foo(object):
def __getattribute__(self, name):
if some_predicate(name):
# ...
else:
# Default behavIoUr
return object.__getattribute__(self, name)