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