gpt4 book ai didi

python - 调用 __getattr__ 方法后

转载 作者:行者123 更新时间:2023-11-30 23:14:21 27 4
gpt4 key购买 nike

在《学习Python 3rd》中,我看到了这段代码

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__ 后会发生什么方法,仅返回 getattr 的方法.

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

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

最佳答案

wrapper 类没有 .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).

包装的对象(带有[1, 2, 3]的列表对象)确实有一个append属性(一个方法),所以getattr(self .wrapped, 'append') 返回它。

调用返回的方法,传入 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]

关于python - 调用 __getattr__ 方法后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28795653/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com