我很好奇PEP 232(函数' s属性)是否也适用于类方法。最后,我认为它没有或我做错了什么?
Python 2.7.6 (default, Feb 26 2014, 12:07:17)
[GCC 4.8.2 20140206 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class Foo(object):
... def a(self):
... print(self.a.bar)
...
>>> f = Foo()
>>> f.a.bar = "bar"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'instancemethod' object has no attribute 'bar'
答案 0 :(得分:4)
实例方法实际上只是函数的包装器。函数仅凭descriptors成为方法。
您始终可以访问基础功能:
f.a.__func__.bar = 'bar'
instancemethod.__func__
属性是底层函数对象。
设置后,方法包装器会代理属性,您无法直接在包装器上设置它们:
>>> f.a.__func__.bar = 'bar'
>>> f.a.bar
'bar'
>>> f.a()
bar
在Python 2中,您也可以使用instancemethod.im_func
,但为了向前兼容Python 3,建议您坚持使用__func__
。
User-defined methods section of the Python data model:
中明确记录了这一点方法还支持访问(但不设置)底层函数对象上的任意函数属性。