2009-09-14 10 views

Respuesta

3

Sí, es posible, pero hay varios problemas. En primer lugar amolar el método se obtiene de la clase en forma obvia se obtiene un objeto urdidor pero no la propia función.

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) 

En segundo lugar no sé si la configuración del nuevo método siempre funciona:

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

No haga esto.

Uso herencia.

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. 

Ahora, corrección de programa principal para usar en lugar de MyVersionOfAClasssome_module.AClass.

+1

Esa era la forma original que miraba el problema, pero que era mucho trabajo. El método en la respuesta aceptada es útil para saber, incluso si no es la manera más correcta de hacer las cosas. –

+1

No es una cuestión de "más correcto" tanto como una cuestión de "leer" y "mantenible". Su caso de uso es la razón * exacta * por la que los lenguajes OO tienen herencia. Puede parecer mucho trabajo, pero es lo que todos los demás programadores esperan ver. A la larga, los divertidos decoradores dinámicos son una responsabilidad. La vieja herencia simple no se convertirá en una responsabilidad. –

Cuestiones relacionadas