Loguear clase - Solucionado

Oswaldo Hernández listas en soft-com.es
Jue Nov 27 19:33:15 CET 2008


Finalmente solucioné el problema. Detallo como por si al alguien le interesa:

La solucion esta en los decoradores, pero andaba errado porque creia que un decorador solo se podia 
implementar con la sintaxis:
	@decorador
	def Funcion()

He visto que los decoradores tambien se pueden implementar directamente en tiempo de ejecución y 
sobre instancias de clase, lo que permite decorar metodos de clases de libreria a las que no tenemos 
acceso al codigo fuente, ni deseamos modificarlo, lo cual es el caso sobre el que trabajo.

Aunque se puede aplicar con metaclases, en este caso no las he utilizado, sino que he creado una 
funcion que recibe instancia y decorador, y aplica el decorador a todos los metodos de la instancia.

# Clase a Loguear
class Persona(object):
     Nombre = None
     Apellido = None
     Edad = None

     def SetDatos(self, Nombre, Apellido):
         print "Asignando Datos a Persona:", Nombre, Apellido
         self.Nombre = Nombre
         self.Apellido = Apellido

     def SetEdad(self, Edad):
         print "Asignando Edad a Persona:", Edad
         self.Edad = Edad

# Decorador a utilizar para Log
class DecoradorLog(object):
     def __init__(self, metodo):
         self.metodo = metodo

     def __call__(self, *args, **kwds):
         # Registra ejecucion
         print "--> Registro de metodo:'%s', argumentos:'%s %s'" % \
             (self.metodo.__name__, str(args), str(kwds))
         # Ejecuta el metodo
         self.metodo(*args, **kwds)


# funcion para asignar decorador a metodos de clase
import types
def DecorarInstancia(instancia, decorador):
     for m in instancia.__class__.__dict__:
         if type(getattr(instancia, m)) is types.MethodType:
             setattr(instancia, m, decorador(getattr(instancia, m)))
     return instancia

# Creacion de instancia
p = Persona()

# Aplicacion el decorador sobre la instancia
DecorarInstancia(p, DecoradorLog)

# resultado:

 >>> p.SetDatos("Oswaldo", "Hernández")
--> Registro de metodo:'SetDatos', argumentos:'('Oswaldo', 'Hern\xc3\xa1ndez') {}'
Asignando Datos a Persona: Oswaldo Hernández
 >>>
 >>> p.SetEdad(18) # De ilusión tabien se vive ;)
--> Registro de metodo:'SetEdad', argumentos:'(18,) {}'
Asignando Edad a Persona: 18


Saludos,

-- 
*****************************************
Oswaldo Hernández
oswaldo (@) soft-com (.) es
*****************************************
PD:
Antes de imprimir este mensaje, asegúrese de que es necesario.
El medio ambiente está en nuestra mano.
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es