Me encontré con este comportamiento cuando intentaba que los decoradores de clases y los decoradores de métodos jugaran muy bien juntos. Esencialmente, los decoradores del método marcarían algunos de los métodos como especiales con algún valor ficticio, y el decorador de clases vendría después y llenaría el valor más tarde. Este es un ejemplo simplificadoAgregando atributos a métodos de instancias en 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
¿Alguien sabe por qué cow.moo.thing = 5
no funciona, a pesar de que cow.moo.thing
me da bastante claridad 10? ¿Y por qué funciona el cow.moo.__func__.thing = 5
? No tengo idea de por qué lo hace, pero al azar jugando con cosas en la lista dir(cow.moo)
tratando de hacer que algo funcione, de repente lo hizo, y no tengo idea de por qué.
Ah bien, nunca lo supe. ¡Gracias! –
Lo siento por revivir una publicación anterior, pero en Python3 'cow(). Moo.thing = 5' está devolviendo' AttributeError: 'method' object no tiene ningún atributo 'thing''. Sabes por qué ? –
@JacquesGaudin En la instancia ('cow(). Moo') la función está envuelta en un objeto de método en cualquier versión de Python - la diferencia está en la clase (' cow.moo') no está envuelta en Python 3. La envoltura es necesaria para que el "self" pase automáticamente a la función. – agf