不知道为什么你会永远这样做,但是......
A.fA实际上是一个完全独立的对象VS的官能团FA。观察:
>>> class A(object):
... def fA(self): pass
... print fA
...
<function fA at 0x10f1c2a28>
>>> A.fA
<unbound method A.fA>
正如你所看到的,A.fA是一个“未绑定的方法”,而不是一个函数。 “不受限制”意味着它不与任何实例相关联;而绑定方法绑定到特定实例。注意:
>>> A().fA
<bound method A.fA of <__main__.A object at 0x10f1d3d10>>
无论哪种方式,方法包装实现它们的功能:
>>> A.fA.im_func
<function fA at 0x10f1c2a28>
注意,地址是一样的一个早期的印刷。
奇怪的是,我不能瑞普你看到的行为:
>>> A.fA.__dict__['x'] = 1
>>> A.fA.x
1
也许,这种差异是由于不同版本的Python。这里是我的:
$ python
Python 2.7.2 (default, Jun 20 2012, 16:23:33)
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
PS:A.fA.x似乎为我工作一样好A.fA.im_func.x,这让我吃惊......再一次,我有点怀疑,为什么你正在考虑这样做。通常,只有当您使用__dict__
时,如果您正在执行__getattr__
(不要与__getattribute__
混淆)。
给予对象(尤其是基本类型的)特设属性也是一个不错的主意。通常可行的替代方案是使用自己的地图,例如
>>> def foo(): pass
...
>>> my_x_values = {foo: 'X'}
>>> my_x_values[foo]
'X'
不是每个人都对此表示赞同。看看这个其他SO问题:Python function attributes - uses and abuses
您正试图在类定义中的方法添加属性? – jdi 2012-07-29 22:00:50
为什么你要这个? – geoffspear 2012-07-29 22:01:10
我想这是因为它是一个Python功能。 在开始时我做了类似的事情,当我希望派生类设置其方法之一的属性时。 我需要正确的答案。 – jimifiki 2012-07-29 22:04:11