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?

¿Fue útil?

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
scroll top