2009-09-14 7 views

Répondre

3

Oui c'est possible, mais il y a plusieurs problèmes. Tout d'abord, vous obtenez la méthode de la classe de façon é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 les paramètres nouvelle méthode fonctionnera toujours:

x = X() 
x.m(1)   #>>> 1 
X.m = increase_decorator(vars(X)['m']) 
x.m(1)   #>>> 2 
7

Ne faites pas cela.

Utilisez 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. 

Maintenant, vous fixer le programme principal d'utiliser MyVersionOfAClass au lieu de some_module.AClass.

+1

C'était la manière originale que j'ai regardé le problème mais c'était beaucoup de travail. La méthode de la réponse acceptée est utile à connaître - même si ce n'est pas la façon la plus correcte de faire les choses. –

+1

Ce n'est pas une question de "plus correct" autant que de "lisible" et "maintenable". Votre cas d'utilisation est la raison * exacte * que les langues OO ont hérité. Cela peut sembler beaucoup de travail, mais c'est ce que tous les autres programmeurs attendent de voir. À long terme, les décorateurs dynamiques amusants sont une responsabilité. L'ancien héritage ne deviendra pas une responsabilité. –

Questions connexes