[pyar] Problema con herencia.

QliX=D! [aka EHB] qlixed en gmail.com
Sab Sep 17 18:47:00 ART 2011


Si, acabo de darme cuenta, se me habia pasado ese detalle :S

Gracias!

2011/9/17 Ariel Rossanigo <arielrossanigo en gmail.com>:
>
>
> 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.
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>



More information about the pyar mailing list