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 .

https://stackoverflow.com/questions/2405590/

相关文章:

python - Python 2 如何比较字符串和整数?为什么列表比较大于数字,而元组大于列表?

linux - 如何请求文件但不使用 Wget 保存?

python - 在列表中查找属性等于某个值的对象(满足任何条件)

python - 使用 groupby 获取组中具有最大值的行

linux - 否定 bash 脚本中的 if 条件

python - 是否可以在没有迭代器变量的情况下实现 Python for range 循环?

python - 什么是 "first-class"对象?

bash - 为什么 $$ 返回与父进程相同的 id?

linux - 在管道 grep 到 grep 后保留颜色

python - 为什么提早返回比其他方法慢?