Comment puis-je ajouter un décorateur à une méthode d'objet existante?
Question
Si j’utilise un module / une classe sur lequel je n’ai aucun contrôle, comment décorerais-je l’une des méthodes?
Je comprends que je peux: my_decorate_method (target_method) ()
, mais je souhaite que cela se produise partout où target_method
est appelé sans avoir à effectuer une recherche / remplacement.
Est-ce même possible?
La solution
Oui, c'est possible, mais plusieurs problèmes se posent. Tout d’abord, vous obtenez la méthode de la classe de manière évidente, vous obtenez un objet warper mais pas la fonction elle-même.
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)
Deuxièmement, je ne sais pas si la nouvelle méthode de paramétrage fonctionnera toujours:
x = X()
x.m(1) #>>> 1
X.m = increase_decorator( vars(X)['m'] )
x.m(1) #>>> 2
Autres conseils
Ne faites pas ça.
Utiliser l'héritage.
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.
Désignez maintenant le programme principal pour qu'il utilise MyVersionOfAClass
au lieu de some_module.AClass
.