3

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

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))

但是,这会引发TypeError. 即使使用operator模块的attrgetter类也会做同样的事情。我正在查看有关自定义属性访问的文档,但我发现它并不容易阅读。我怎样才能解决这个问题?

4

2 回答 2

7

如果我对您的理解正确,那么您正在做的事情是正确的,但它仍然不适用于您尝试使用它的用途。原因是隐式魔法方法查找不使用__getattr____getattribute__或任何其他类似的东西)。这些方法实际上必须以它们的神奇名称显式地存在。您的方法适用于普通属性,但不适用于魔术方法。(请注意,如果您Foo(5).__lt__(4)明确地这样做,它将起作用;它只是隐式的“魔术”查找——例如,在使用__lt__时调用<)——被阻止。)

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

于 2012-09-07T03:43:16.883 回答
1

__*__除非它们确实存在,否则方法将不起作用 - 因此它们__getattr____getattribute__不允许您代理这些调用。您必须手动创建每个方法。

是的,这确实涉及相当多的复制和粘贴。是的,在这种情况下完全没问题。

您也许可以使用werkzeug LocalProxy类作为基础或代替您自己的类;使用时您的代码将如下所示LocalProxy

print(LocalProxy(lambda: 5) > LocalProxy(lambda: 4))
于 2012-09-07T03:41:37.037 回答