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

Pau Cervera pau.cervera en gmail.com
Lun Ene 31 22:45:09 CET 2011


Yo diría que es porqué estás haciendo un get de d, y ya cuando lo tienes
haces una asignación al índice 'a' de ese objeto.

-----
Pau

Python..., what else?


2011/1/31 Jose Caballero <jcaballero.hep en gmail.com>

> 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é?
>
>
>
>
>
>
>
>
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20110131/ae4ade58/attachment.html>


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