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