[Python-es] ¿ __setattr__() no se invoca para reescribir un par (key,value) en un diccionario dentro de una clase?

Daniel Garcia dani en danigm.net
Lun Ene 31 22:45:04 CET 2011


On Mon, Jan 31, 2011 at 04:25:51PM -0500, Jose Caballero wrote:
> Hola,
> 
> perdón por el subject, es un poco críptico. Intento explicarlo...
> 
> Sea una clase C como la siguiente
> 
> ----------------------------------------------------------------------
> class C:
>         def __init__(self):
>                 self.x = 0
>                 self.d = {'a':'A','b':'B'}
>         def __setattr__(self, var, value):
>                 print 'invoking __setattr__ ', var, value
>                 self.__dict__[var] = value
> ----------------------------------------------------------------------
> 
> Si ahora escribimos un código como
> 
> obj = C()
> 
> Se genera el siguiente output
> 
> invoking __setattr__  x 0
> invoking __setattr__  d {'a': 'A', 'b': 'B'}
> 
> Que corresponde a las dos asignaciones que aparecen en el __init__()
> Perfecto.
> 
> ----------------------------------------------------------------------
> 
> Si además hacemos algo como
> 
> obj.x = 1
> 
> obtenemos una nueva línea en el output
> 
> invoking __setattr__  x 1
> 
> ----------------------------------------------------------------------
> 
> Sin embargo no veo una línea similar si ahora escribo
> 
> obj.d['a']='AA'
> 
> ¿Por qué?

Al hacer obj.d['a'] = 'AA' no se está llamando al setattr porque no
estás añadiendo un atributo al objeto, sino un elemento al
diccionario d.
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: no disponible
Type: application/pgp-signature
Size: 198 bytes
Desc: no disponible
URL: <http://mail.python.org/pipermail/python-es/attachments/20110131/e0e17098/attachment.pgp>


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