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?

Était-ce utile?

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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top