2009-09-14 12 views

risposta

3

Sì, è possibile, ma ci sono diversi problemi. Per prima cosa si ottiene il metodo dalla classe in modo ovvio si ottiene un oggetto warper ma non la funzione stessa.

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) 

In secondo luogo io non so se le impostazioni nuovo metodo funziona sempre:

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

non fare questo.

Utilizzare l'ereditarietà.

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. 

Ora, aggiustare programma principale da usare al posto di MyVersionOfAClasssome_module.AClass.

+1

Questo era il modo originale in cui ho esaminato il problema, ma era un sacco di lavoro. Il metodo nella risposta accettata è utile per sapere - anche se non è il modo più corretto di fare le cose. –

+1

Non è una questione di "più corretto" tanto quanto una questione di "leggibile" e "gestibile". Il tuo caso d'uso è il motivo * esatto * per cui le lingue OO hanno ereditarietà. Può sembrare molto lavoro, ma è quello che ogni altro programmatore si aspetta di vedere. A lungo termine, i decoratori dinamici e divertenti sono una responsabilità. La semplice eredità antica non diventerà una responsabilità. –

Problemi correlati