• Domingo 17 de Noviembre de 2024, 19:40

Autor Tema:  Problema con lista dentro de un objeto  (Leído 1450 veces)

huaskatras

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Problema con lista dentro de un objeto
« en: Lunes 23 de Enero de 2012, 15:44 »
0
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
  1. Clientes[]
  2. dic_Clientes{}
  3. class Cliente:
  4.  
  5.         def __init__(self,nombre,suministrador="", tipo="", demanda_cliente=[],barra="",curva= 0):
  6.                 self.nombre = nombre
  7.                 self.suministrador = suministrador
  8.                 self.demanda_cliente = demanda_cliente
  9.                 self.barra = barra
  10.                 self.curva = curva      
  11.                 self.tipo = tipo
  12.                 dic_Clientes[nombre] = len(Clientes)  # Diccionario con nombre de cliente como clave y con indice Clientes[] como valor
  13.                 Clientes.append(self)
  14.         def __str__(self):
  15.                 return self.nombre
  16.        
  17.         def agrega_lineademanda(self,ano,mes,suministrador,pot_media,f_carga):
  18.                 indice = len(self.demanda_cliente)
  19.                 self.demanda_cliente.append([0,0,"",0,0,0])
  20.                 self.demanda_cliente[indice][0] = ano
  21.                 self.demanda_cliente[indice][1] = mes
  22.                 self.demanda_cliente[indice][2] = suministrador
  23.                 self.demanda_cliente[indice][3] = pot_media
  24.                 self.demanda_cliente[indice][4] = f_carga
  25.                 indice_curva = dic_Curvas[str(self.curva)]
  26.                 indice_mes = mes - 1
  27.                 hora_b1 = float(Hora_Bloques[indice_mes][0])
  28.                 hora_b2 = float(Hora_Bloques[indice_mes][1])
  29.                 hora_b3 = float(Hora_Bloques[indice_mes][2])
  30.                 hora_b4 = float(Hora_Bloques[indice_mes][3])
  31.                 curva_b1 = float(Curvas[indice_curva].Bloque1[indice_mes])
  32.                 curva_b2 = float(Curvas[indice_curva].Bloque2[indice_mes])
  33.                 curva_b3 = float(Curvas[indice_curva].Bloque3[indice_mes])
  34.                 curva_b4 = float(Curvas[indice_curva].Bloque4[indice_mes])
  35.                 demandames = float(pot_media)/float(f_carga)*(curva_b1*hora_b1+curva_b2*hora_b2+curva_b3*hora_b3+curva_b4*hora_b4)
  36.                 self.demanda_cliente[indice][5] = demandames
  37.  
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
  1. def ObtenerClientes():
  2.         ObtenerCurvas()
  3.         f_clientes = open("datos.dem","r")
  4.         while 1:
  5.                 s = f_clientes.readline()
  6.                 if s == "":
  7.                         f_clientes.close()
  8.                         return
  9.                 if s == "\n": continue
  10.                 s_clientes = s.strip()
  11.                 split_clientes = s_clientes.split()
  12.                 if split_clientes[0] == "consfut":                                      #Linea que marca la introducción de consumos
  13.                         while 1:
  14.                                 s2 = f_clientes.readline()
  15.                                 s2_c = s2.strip()
  16.                                 if s2 == "find" or s2 == "":
  17.                                         f_clientes.close()
  18.                                         return
  19.                                 if s2 == '\n': continue
  20.                                 split_s2 = s2_c.split()
  21.                                 if split_s2[0] == "/*" or split_s2[0] == "consumo" : continue                   #Si es comentario continuo
  22.                                 if split_s2[0] == "find":
  23.                                         f_clientes.close()
  24.                                         return
  25.                                 cliente = split_s2[0]
  26.                                 ano = int(split_s2[1])
  27.                                 mes = int(split_s2[2])
  28.                                 pot_media = float(split_s2[5])
  29.                                 f_carga = float(split_s2[6])
  30.                                 curva = int(split_s2[7])
  31.                                 barra = split_s2[10]
  32.                                 suministrador = split_s2[11]
  33.                                 tipo = split_s2[19]
  34.                                
  35.                                 if not dic_Clientes.has_key(cliente):
  36.                                         O_cliente = Cliente(cliente)
  37.                                         O_cliente.tipo = tipo
  38.                                         O_cliente.barra = barra
  39.                                         O_cliente.curva = curva
  40.                                         O_cliente.agrega_lineademanda(ano,mes,suministrador,pot_media,f_carga)
  41.                                 elif dic_Clientes.has_key(cliente):
  42.                                         indice_Clientes = dic_Clientes[cliente]
  43.                                         O_cliente = Clientes[indice_Clientes]
  44.                                         O_cliente.agrega_lineademanda(ano,mes,suministrador,pot_media,f_carga)
  45.  
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

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re:Problema con lista dentro de un objeto
« Respuesta #1 en: Lunes 23 de Enero de 2012, 18:01 »
0
Estimados:
Creo que lo solucioné... la definición de __init__ la estaba haciendo como:
Código: Python
  1. class Cliente:
  2.   def __init__(self,nombre,suministrador="",tipo="",demanda_cliente[], barra"",curva=0)
  3.     self.nombre = nombre
  4.     self.suministrador = suministrador
  5.     self.demanda_cliente = demanda_cliente
  6.     #etc
  7.  
La solución fue definir así:
Código: Python
  1. class Cliente:
  2.   def __init__(self,nombre,suministrador="",tipo="", barra"",curva=0)
  3.     self.nombre = nombre
  4.     self.suministrador = suministrador
  5.     self.demanda_cliente = []
  6.     #etc
  7.  
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