调用 __getattr__ 方法后

After calling __getattr__ method

在学习中Python第3次看到这段代码

class wrapper:
    def __init__(self, object):
        self.wrapped = object
    def __getattr__(self, attrname):
        print("Trace:", attrname)
        return getattr(self.wrapped, attrname)

x = wrapper([1,2,3])
x.append(4)
print(x.wrapped)

我想知道调用此 __getattr__ 方法后到底发生了什么,这仅 returns 方法 getattr

为什么最后一行的结果是[1, 2, 3, 4]

没有使用原始参数执行返回函数的代码。

wrapper class 没有 .append 属性,因此 Python 回退到 wrapper.__getattr__ 方法。来自 object.__getattr__ special method documentation:

Called when an attribute lookup has not found the attribute in the usual places (i.e. it is not an instance attribute nor is it found in the class tree for self).

wrapped对象(带[1, 2, 3]的list对象)确实有append属性(方法),所以getattr(self.wrapped, 'append')returns它。

调用返回的方法,传入 4,将其附加到 self.wrapped 列表对象。

您可以轻松地自己重现这些步骤:

>>> wrapped = [1, 2, 3]
>>> getattr(wrapped, 'append')
<built-in method append of list object at 0x107256560>
>>> getattr(wrapped, 'append')(4)
>>> wrapped
[1, 2, 3, 4]