【发布时间】:2014-02-23 21:42:33
【问题描述】:
所以为了摆脱一些样板,我选择实现__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__。
【问题讨论】:
-
抛出哪个错误?我想知道。
-
任何属性查找错误。如果您已经在描述符的
__get__方法内,并且该方法内的任何内容都引发了属性查找异常,则查找将继续使用__getattr__。
标签: python-2.7 attributes descriptor getattr name-lookup