pep 232也适用于例如方法吗?

时间:2014-04-28 15:26:10

标签: python function class methods properties

我很好奇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'

1 个答案:

答案 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

中明确记录了这一点
  

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