Como posso adicionar um decorador para um método de objeto existente?
Pergunta
Se eu estou usando um módulo / classe I não tem controle sobre, como eu ia decorar um dos métodos?
Eu entendo que eu posso: my_decorate_method(target_method)()
mas eu estou olhando para que isso aconteça sempre que target_method
é chamado sem ter que fazer uma pesquisa / substituir
Será que é mesmo possível?
Solução
Sim, é possível, mas há vários problemas. Primeiro whet você começa método de classe em forma óbvia que você obter um objeto warper mas não a própria função.
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)
Em segundo lugar eu não sei se as configurações novo método irá funcionar sempre:
x = X()
x.m(1) #>>> 1
X.m = increase_decorator( vars(X)['m'] )
x.m(1) #>>> 2
Outras dicas
Não faça isso.
Use herança.
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.
Agora, corrigi-lo programa principal para uso MyVersionOfAClass
vez de some_module.AClass
.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow