当我试图让类装饰器和方法装饰器很好地结合在一起时,我遇到了这种行为。本质上,方法装饰器会将一些方法标记为特殊的并带有一些虚拟值,而类装饰器会在之后出现并稍后填充该值。这是一个简化的例子
>>> 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
有谁知道为什么cow.moo.thing = 5
不起作用,即使cow.moo.thing
很清楚地给了我 10?为什么cow.moo.__func__.thing = 5
有效?我不知道它为什么会这样,但是在随机摆弄dir(cow.moo)
列表中的东西试图让它工作时,它突然做到了,我不知道为什么。