__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