Programación Web y Scripting > Python

 Problema con lista dentro de un objeto

(1/1)

huaskatras:
Estimados:
Parto contándoles que soy totalmente noob en Python, de hecho mi única experiencia como programado son algunas macros en VBA.
Querio leer datos de clientes de un archivo llamado "datos.dem" y para ello me hice una clase Cliente que es mas menos así:

--- Código: Python ---Clientes[]dic_Clientes{}class Cliente:         def __init__(self,nombre,suministrador="", tipo="", demanda_cliente=[],barra="",curva= 0):                self.nombre = nombre                self.suministrador = suministrador                self.demanda_cliente = demanda_cliente                self.barra = barra                self.curva = curva                      self.tipo = tipo                dic_Clientes[nombre] = len(Clientes)  # Diccionario con nombre de cliente como clave y con indice Clientes[] como valor                Clientes.append(self)        def __str__(self):                return self.nombre                def agrega_lineademanda(self,ano,mes,suministrador,pot_media,f_carga):                indice = len(self.demanda_cliente)                self.demanda_cliente.append([0,0,"",0,0,0])                self.demanda_cliente[indice][0] = ano                self.demanda_cliente[indice][1] = mes                self.demanda_cliente[indice][2] = suministrador                self.demanda_cliente[indice][3] = pot_media                self.demanda_cliente[indice][4] = f_carga                indice_curva = dic_Curvas[str(self.curva)]                indice_mes = mes - 1                hora_b1 = float(Hora_Bloques[indice_mes][0])                hora_b2 = float(Hora_Bloques[indice_mes][1])                hora_b3 = float(Hora_Bloques[indice_mes][2])                hora_b4 = float(Hora_Bloques[indice_mes][3])                curva_b1 = float(Curvas[indice_curva].Bloque1[indice_mes])                curva_b2 = float(Curvas[indice_curva].Bloque2[indice_mes])                curva_b3 = float(Curvas[indice_curva].Bloque3[indice_mes])                curva_b4 = float(Curvas[indice_curva].Bloque4[indice_mes])                demandames = float(pot_media)/float(f_carga)*(curva_b1*hora_b1+curva_b2*hora_b2+curva_b3*hora_b3+curva_b4*hora_b4)                self.demanda_cliente[indice][5] = demandames Luego hice una función para obtener los clientes desde un archivo, la función es más menos así (Las curvas y las horas_bloques están bien definidas en otras listas y diccionarios):

--- Código: Python ---def ObtenerClientes():        ObtenerCurvas()        f_clientes = open("datos.dem","r")        while 1:                s = f_clientes.readline()                if s == "":                        f_clientes.close()                        return                if s == "\n": continue                s_clientes = s.strip()                split_clientes = s_clientes.split()                if split_clientes[0] == "consfut":                                      #Linea que marca la introducción de consumos                        while 1:                                s2 = f_clientes.readline()                                s2_c = s2.strip()                                if s2 == "find" or s2 == "":                                        f_clientes.close()                                        return                                if s2 == '\n': continue                                split_s2 = s2_c.split()                                if split_s2[0] == "/*" or split_s2[0] == "consumo" : continue                   #Si es comentario continuo                                if split_s2[0] == "find":                                        f_clientes.close()                                        return                                cliente = split_s2[0]                                ano = int(split_s2[1])                                mes = int(split_s2[2])                                pot_media = float(split_s2[5])                                f_carga = float(split_s2[6])                                curva = int(split_s2[7])                                barra = split_s2[10]                                suministrador = split_s2[11]                                tipo = split_s2[19]                                                                if not dic_Clientes.has_key(cliente):                                        O_cliente = Cliente(cliente)                                        O_cliente.tipo = tipo                                        O_cliente.barra = barra                                        O_cliente.curva = curva                                        O_cliente.agrega_lineademanda(ano,mes,suministrador,pot_media,f_carga)                                elif dic_Clientes.has_key(cliente):                                        indice_Clientes = dic_Clientes[cliente]                                        O_cliente = Clientes[indice_Clientes]                                        O_cliente.agrega_lineademanda(ano,mes,suministrador,pot_media,f_carga) El problema es que al consultar por ejemplo la demanda de 1 Cliente
demanda_cliente = Clientes[0].demanda_cliente
resulta que esta demanda guarda las filas de demanda de todos los clientes... no entiendo cual puede ser el error si aplico el método sobre el objeto O_cliente.agrega_lineademanda(......) y O_cliente lo estoy cambiando cada vez.
Espero me puedan ayudar.

huaskatras:
Estimados:
Creo que lo solucioné... la definición de __init__ la estaba haciendo como:

--- Código: Python ---class Cliente:  def __init__(self,nombre,suministrador="",tipo="",demanda_cliente[], barra"",curva=0)    self.nombre = nombre    self.suministrador = suministrador    self.demanda_cliente = demanda_cliente    #etc La solución fue definir así:

--- Código: Python ---class Cliente:  def __init__(self,nombre,suministrador="",tipo="", barra"",curva=0)    self.nombre = nombre    self.suministrador = suministrador    self.demanda_cliente = []    #etc Al parecer de la primera forma, el atributo demanda_cliente de todos las instancias de la clase Cliente apuntaban a la misma lista....
Espero estar en lo correcto y que a alguien más le sirva.
Saludos

Navegación

[0] Índice de Mensajes

Ir a la versión completa