在关于实例方法的文档中,它声明:
方法还支持访问(但不设置)底层函数对象上的任意函数属性。
但我似乎无法验证这种限制。我尝试设置一个任意值和一个特殊属性"功能:
class cls:
def foo(self):
f = self.foo.__func__
f.a = "some value" # arbitrary value
f.__doc__ = "Documentation"
print(f.a, f.__doc__)
执行时,不会产生错误,输出也符合预期:
cls().foo() # prints out f.a, f.__doc__
我对文档的误解是什么?
答案 0 :(得分:2)
你误解了所说的话。它表示您可以访问但不能从方法设置基础函数对象的属性!
>>> class Foo:
... def foo(self):
... self.foo.__func__.a = 1
... print(self.foo.a)
... self.foo.a = 2
...
>>> Foo().foo()
1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in foo
AttributeError: 'method' object has no attribute 'a'
请注意在foo.a
值上设置时__func__
的更新方式,但您无法使用self.foo.a = value
直接设置它。
因此可以根据需要修改函数对象, wrapper 方法只提供对底层函数属性的只读访问。