所以为了摆脱一些样板,我选择实现__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__
.