Добавление атрибутов к методам экземпляра в Python

Я столкнулся с этим поведением, когда пытался заставить декораторы классов и декораторы методов хорошо работать вместе. По сути, декораторы методов помечали бы некоторые из методов как особые с некоторым фиктивным значением, а декоратор класса появлялся после и заполнял значение позже. Это упрощенный пример

>>> 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) , пытаясь заставить что-то работать, это внезапно сработало, и я не знаю почему.

33
задан Steven T. Snyder 1 March 2012 в 20:59
поделиться