Я столкнулся с этим поведением, когда пытался заставить декораторы классов и декораторы методов хорошо работать вместе. По сути, декораторы методов помечали бы некоторые из методов как особые с некоторым фиктивным значением, а декоратор класса появлялся после и заполнял значение позже. Это упрощенный пример
>>> 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)
, пытаясь заставить что-то работать, это внезапно сработало, и я не знаю почему.