Wpadłem na to zachowanie, starając się, aby dekoratorzy klas i dekoratorzy metod ładnie ze sobą współpracowali. Zasadniczo, dekoratory metod oznaczałyby niektóre z metod jako specjalne z pewną wartością fikcyjną, a dekorator klasy przychodziłby po znaku i wprowadzał wartość później. Jest to uproszczony przykładDodawanie atrybutów do instancemethods w Pythonie
>>> 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
Czy ktoś wie dlaczego cow.moo.thing = 5
nie działa, chociaż cow.moo.thing
dość wyraźnie daje mi 10? I dlaczego działa cow.moo.__func__.thing = 5
? Nie mam pojęcia, dlaczego tak jest, ale w przypadkowym manipulowaniu materiałem na liście dir(cow.moo)
próbując dostać coś do roboty, zrobiło to nagle i nie mam pojęcia dlaczego.
Ah ok, nigdy nie wiedziałem. Dzięki! –
Przepraszamy za ponowne wczytanie starego posta, ale w Python3 'cow(). Moo.thing = 5' zwraca" AttributeError: 'obiekt' method 'nie ma atrybutu "thing". Wiesz dlaczego ? –
@JacquesGaudin W instancji ('krowa(). Moo') funkcja jest zawijana w obiekcie metody w dowolnej wersji Pythona - różnica jest na klasie (' cow.moo'), nie jest opakowana w Pythonie 3. Owijanie jest konieczne, aby 'self' został automatycznie przekazany do funkcji. – agf