在__func__上设置属性

时间:2016-11-10 13:29:58

标签: python function class

在关于实例方法的文档中,它声明:

  

方法还支持访问(但不设置)底层函数对象上的任意函数属性。

但我似乎无法验证这种限制。我尝试设置一个任意值和一个特殊属性"功能:

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__

我对文档的误解是什么?

1 个答案:

答案 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 方法只提供对底层函数属性的只读访问。