[pyar] cómo averiguo en el decorador la clase de un método decorado?
Nicolas Sarubbi
nicosarubbi en gmail.com
Lun Ene 17 23:52:56 ART 2011
Hola gente!! Necesito hacer algo así:
<codigo no probado y muy resumido>
def deco(f):
cls = f.im_class # debería retornar la clase a la que pertenece el método
cls.x = getattr(cls, 'x', 0) # si el atributo no existe, lo inicializa
cls.x += 1 # modifico el atributo de clase
return f # retorno la misma función sin modificaciones
class A():
x = 0
pass
class B(A):
@deco
def fu(self):
pass
</codigo>
Osea... necesito que la función decoradora haga "algo" sobre la clase
a la cual pertenece el método que estoy decorando (no necesito
agregarle nada a la función, sino a la clase)...
El problema es que al hacerlo de esta forma, el decorador está
recibiendo como parámetro a la función 'fu' y no al método 'B.fu', ni
al método 'B().fu' (acabo de aprender que son 3 cosas distintas XD ).
De hecho, al ejecutarse el decorador la clase ni siquiera existe
(todavía no se terminó de crear).
Puedo agregar código en el deco o en la clase A, y no importa si queda
feo. Pero la idea es dejar la definición de B lo más simple posible.
Y de paso, me gustaría arreglar las lineas 3 y 4
<codigo>
cls.x = getattr(cls, 'x', 0)
cls.x += 1
</codigo>
La idea es tener un atributo de clase definido en todas las subclases
de 'A', que cada subclase tenga su propio atributo de clase 'x', y que
se modifique cuando uso el decorador. Este atributo lo voy a leer
cuando se crea una instancia de B.
¿sugerencias?
Una versión más detallada está en [1], pero dejó de funcionar cuando
me puse a jugar con los decoradores XD
[1] https://www.assembla.com/code/nicoslibrary/subversion/nodes/trunk/gtkSimpleController.py
saludos... nico.
More information about the pyar
mailing list