[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