调用 __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]
在学习中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]