为什么没有为缺少"神奇"调用的方法调用__getattr__?

Tyl*_*ton 3 python getattr python-3.x

我试图实现一个类,其中尝试访问当前类或其任何祖先中不存在的任何属性将尝试从成员访问这些属性.下面是我想要做的一个简单的版本.

class Foo:
    def __init__(self, value):
        self._value = value

    def __getattr__(self, name):
        return getattr(self._value, name)

if __name__ == '__main__':
    print(Foo(5) > Foo(4)) # should do 5 > 4 (or (5).__gt__(4))
Run Code Online (Sandbox Code Playgroud)

然而,这提出了一个TypeError.即使使用operator模块的attrgetter类也可以做同样的事情.我正在查看有关自定义属性访问的文档,但我发现它并不容易阅读.我怎么能绕过这个?

Bre*_*arn 7

如果我理解正确,你所做的是正确的,但它仍然无法用于你正在尝试使用它.原因是隐式魔术方法查找不使用__getattr__(__getattribute__或任何其他此类事物).这些方法实际上必须使用它们的魔术名称.您的方法适用于普通属性,但不适用于魔术方法.(注意,如果你Foo(5).__lt__(4)明确地做了,它会工作;它只是隐含的"魔术"查找 - 例如,调用__lt__何时<使用)---被阻止.)

这篇文章描述了一种使用元类自动生成魔术方法的方法.如果您只需要某些方法,则可以手动在类上定义它们.