[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