¿Cómo puedo agregar un decorador a un método de objeto existente?
Pregunta
Si estoy usando un módulo / clase sobre el que no tengo control, ¿cómo decoraría uno de los métodos?
Entiendo que puedo: my_decorate_method (target_method) ()
pero estoy buscando que esto suceda donde sea que se llame a target_method
sin tener que hacer una búsqueda / reemplazo.
¿Es posible?
Solución
Sí, es posible, pero hay varios problemas. Primero, si obtiene el método de la clase de manera obvia, obtiene un objeto warper pero no la función en sí.
class X(object):
def m(self,x):
print x
print X.m #>>> <unbound method X.m>
print vars(X)['m'] #>>> <function m at 0x9e17e64>
def increase_decorator(function):
return lambda self,x: function(self,x+1)
Segundo, no sé si la configuración del nuevo método siempre funcionará:
x = X()
x.m(1) #>>> 1
X.m = increase_decorator( vars(X)['m'] )
x.m(1) #>>> 2
Otros consejos
No hagas esto.
Usar herencia.
import some_module
class MyVersionOfAClass( some_module.AClass ):
def someMethod( self, *args, **kwargs ):
# do your "decoration" here.
super( MyVersionOfAClass, self ). someMethod( *args, **kwargs )
# you can also do "decoration" here.
Ahora, arregle su programa principal para usar MyVersionOfAClass
en lugar de some_module.AClass
.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow