什么是属性查找链中的__getattr__顺序?

时间:2014-02-23 21:42:34

标签: python-2.7 attributes descriptor getattr name-lookup

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

1 个答案:

答案 0 :(得分: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

你能指出“彼此玩得好”的意思吗? 根据我的理解,这是一种很好玩的方式:Method delegation in python