[pyar] Problema con herencia.
Ariel Rossanigo
arielrossanigo en gmail.com
Sab Sep 17 18:31:47 ART 2011
El 17 de septiembre de 2011 17:50, QliX=D! [aka EHB] <qlixed en gmail.com>escribió:
> Estimados,
> Tengo un inconveniente bastante particular y no logro dar con la
> logica de por que me sucede.
> Lo puedo solucionar implementando el esquema de otra forma, pero me
> gustaria entender el problema y tratar de dejar la implementacion que
> arme.
>
> Tengo la siguientes clases cortas:
>
> class Operation (object):
> def __init__(self):
> pass
> def __repr__(self):
> return self.__str__()
> def do(self):
> raise NotImplementedError()
>
>
> class RelationalOperation(Operation):
> __relations = []
>
> def __init__(self, *args):
> for arg in args:
> print "Added:" + str(arg)
> self.__relations.append(arg)
> def __str__(self):
> return self.__class__.__name__ + " Between:" + str(self.__relations)
> @property
> def relations(self):
> return self.__relations
>
> class AddedRelation(RelationalOperation):
> def __init__(self, aRelation):
> super(AddedRelation, self).__init__(aRelation)
> def __repr__(self):
> return "<"+self.__class__.__name__ + ": " +
> ",".join(self.relations)+">"
> def __str__(self):
> return self.__class__.__name__ + str(self.relations)
>
> Ahora, al momento de utilizarlas tengo el siguiente inconveniente:
>
> #....
>
> relations_stack.append(AddedRelation("hola"))
>
> #....
>
> try:
> while (True):
> sentences_stack.append(AddedRelation(relations_stack.pop()))
> except IndexError:
> pass
>
> print sentences_stack # [<AddedRelation: hola>]
> #....
>
> relations_stack.append(AddedRelation("chau"))
>
> #....
>
> try:
> while (True):
> sentences_stack.append(AddedRelation(relations_stack.pop()))
> except IndexError:
> pass
>
> print sentences_stack # [<AddedRelation: hola, chau>, <AddedRelation:
> hola, chau>]
>
> O sea, se me "updatea" el valor anterior con el nuevo mas el valor
> nuevo agregado en la "pila".
>
> Que hice mal? en la definicion de clases?
>
>
El problema es que __relations es un atributo de clase, el cual es
compartido por todas las instancias de esa clase. Como __relations es una
lista y nunca le cambias su valor, todas las instancias hacen referencia a
la misma lista.
Una posible solución sería agregar al __init__ de RelationalOperation lo
siguiente:
...
self.__relations = []
Saludos.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20110917/45a80e92/attachment.html>
More information about the pyar
mailing list