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
Ir a la versión completa