如何在Python中覆盖__getattr__而不会破坏默认行为?

问题:

我想覆盖一个类上的__getattr__方法来做一些奇怪的事情,但是我不想打破默认行为。
这样做的正确方法是什么?

回答:

覆盖__getattr__应该是正确的 – __getattr__仅被称为最后的手段,即如果实例中没有与该名称匹配的属性。例如,如果您访问foo.bar,那么只有foo没有属性bar时才会调用__getattr__。如果属性是您不想处理的属性,请加注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)

the Python docs for more

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: How do I override __getattr__ in Python without breaking the default behavior?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

1 + 7 =