小编典典

如何在不破坏默认行为的情况下覆盖 Python 中的 __getattr__?

all

我想重写__getattr__类上的方法来做一些花哨的事情,但我不想破坏默认行为。

这样做的正确方法是什么?


阅读 62

收藏
2022-06-29

共1个答案

小编典典

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

有关更多信息,请参阅Python
文档

2022-06-29