[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 23:03:10 CET 2011


Eso mismo quería decir yo. Si en lugar de eso haces un set,

obj.d = "hola",

volverá a pasar por el setter.
Quizá esto <http://users.rcn.com/python/download/Descriptor.htm> te resulte
interesante. También recuerdo que había una presentación de alguien, en
texto plano, sobre metaclasses y descriptores, pero no lo encuentro.

-----
Pau

Python..., what else?


2011/1/31 Daniel Garcia <dani en danigm.net>

> 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.
>
> _______________________________________________
> 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/0b52ca5d/attachment.html>


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