1

所以为了摆脱一些样板,我选择实现__getattr__委派一些方法调用。问题是我在属性查找链中也有一个描述符,它们没有像我预期的那样交互。这是代码:

class C(object):
    attr = Descriptor()

    def __getattr__(self, item):
        # just returns a method for all items that match
        # a certain pattern

这就是问题所在。所有 Python 文档都提到__getattr__只有在通常的查找链失败后才被调用,但在这种情况下__getattr__总是在attr.

那么,什么是同时拥有一个描述符并__getattr__相互配合的正确方法呢?

这是我正在观察的:

a = C()
a.attr # goes to __getattr__ instead of C.attr.__get__

问题解决了。事实证明,如果描述符引发异常,则查找会跳转到__getattr__.

4

1 回答 1

0

但在这种情况下__getattr__总是被提前调用attr

对不起,我不明白。

>>> class C(object):
    attr = property(fget = lambda self: 5)

    def __getattr__(self, item):
        # just returns a method for all items that match
        # a certain pattern

    return item

>>> C().x
'x'
>>> C().attr # attr.__get__ is called, not __getattr__
5

你能具体说明“和对方好好相处”是什么意思吗?据我了解,一种玩得很好的方法:python中的方法委托

于 2014-02-23T21:51:26.617 回答