在Python中向instancemethods添加属性

Li *_*oyi 33 python instance-method

当我试图让类装饰器和方法装饰器很好地一起玩时,我遇到了这种行为.从本质上讲,方法装饰器会将某些方法标记为特殊的一些虚拟值,并且类装饰器将在之后出现并稍后填充该值.这是一个简化的例子

>>> class cow:
>>>     def moo(self):
>>>         print 'mooo'
>>>     moo.thing = 10
>>>
>>> cow.moo.thing
10
>>> cow().moo.thing
10
>>> cow.moo.thing = 5
AttributeError: 'instancemethod' object has no attribute 'thing'
>>> cow().moo.thing = 5
AttributeError: 'instancemethod' object has no attribute 'thing'
>>> cow.moo.__func__.thing = 5
>>> cow.moo.thing 
5
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么cow.moo.thing = 5不起作用,即使cow.moo.thing很清楚地给我10?为什么cow.moo.__func__.thing = 5有效?我不知道它为什么会这样,但是随机摆弄dir(cow.moo)列表中的东西试图让它起作用突然间,我不明白为什么.

agf*_*agf 36

对于属性查找,Python会自动使用附加到实例方法的实际函数.

对于属性设置,它不是.

它们是两个独立的操作,取决于您所使用的语句的哪一侧,即使它们都使用.运算符.

当您访问实例方法时__func__,您手动访问实际具有该moo属性的实际函数.

在Python 3中,这将按照您希望/期望的方式工作,因为方法基本上只是函数.