__setattr__ para atributos de clases
Gabriel Genellina
gagsl-py2 en yahoo.com.ar
Sab Jun 21 11:32:21 CEST 2008
En Fri, 20 Jun 2008 13:36:28 -0300, Milton Galo Patricio Inostroza
Aguilera <minoztro en gmail.com> escribió:
> Hace mucho tiempo que utilizo __setattr__ para atributos de
> instancia y funciona a la perfección, pero ahora necesito ser
> notificado cuando el programador agregue un nuevo atributo al __dict__
> de la clase, para ejemplificar pondré un ejemplo:
>
>>>> class test(object):
> ... def __init__(self):
> ... self.a = 5
> ... def __setattr__(self, aName, aValue):
> ... print aName, aValue
> ... object.__setattr__(self, aName, aValue)
>
> pero cuando agrego un atributo de clase no se como lograr este
> comportamiento, intente modificar el atributo __dict__ para
> reemplazarlo por otro diccionario el cual implemente un comportamiento
> especial en __setitem__ (anteriormente visto en la lista).
Asi como para manejar atributos de la instancia estas definiendo un metodo
de la clase, para manejar atributos de la clase se define un metodo en su
metaclase:
py> class MetaNotificacion(type):
... def __setattr__(self, aName, aValue):
... print "MetaNotificacion", aName, aValue
... super(MetaNotificacion, self).__setattr__(aName, aValue)
...
py> class test(object):
... __metaclass__ = MetaNotificacion
... def __init__(self):
... self.a = 5
... def __setattr__(self, aName, aValue):
... print aName, aValue
... object.__setattr__(self, aName, aValue)
...
py> prueba = test()
a 5
py> prueba.e = 'hola'
e hola
py> test.x = 1
MetaNotificacion x 1
Por otro lado, usar __setattr__ (tanto para instancias como para clases)
enlentece *muchisimo* el programa porque *toda* vez que se asigna valor a
un atributo se ejecuta ese codigo (y por mas que trates de hacer lo minimo
indispensable, ya el hecho de localizar la funcion, construir el
instancemethod, e invocar codigo Python para algo que normalmente se hace
directamente en C, lo torna muuuuuuy lento).
--
Gabriel Genellina
------------ próxima parte ------------
_______________________________________________
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