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