Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: lnvisible en 6 Diciembre 2010, 23:37 pm



Título: [python] Objetos que se guardan y cargan solos
Publicado por: lnvisible en 6 Diciembre 2010, 23:37 pm
Hola, estoy aprendiendo python y quiero hacer que un objeto se guarde y cargue solo, y sus subclases también. Tengo esto:

Código
  1. from pickle import load, dump
  2.  
  3. class Auto:
  4.  
  5.  def __init__(self):
  6.    try:
  7.      self.load()
  8.    except:
  9.      self.counter = 0
  10.  
  11.  def load(self):
  12.    with open(self.__class__.__name__, 'rb') as f:
  13.      self = load(f)
  14.  
  15.  def dump(self):
  16.    with open(self.__class__.__name__, 'wb') as f:
  17.      dump(self, f)
  18.  
  19. class Test(Auto):
  20.  def increment(self):
  21.    self.counter += 1
  22.    print(self.counter)
  23.    self.dump()
  24.  
  25. if __name__ == "__main__":
  26.  t = Test()
  27.  t.increment()

¿Hay algo mal?

GRacias!!


Título: Re: [python] Objetos que se guardan y cargan solos
Publicado por: ChicoMaravilla en 7 Diciembre 2010, 02:44 am
¿A que te refieres con que se guarde y cargue solo?. ¿A que cuando prendes la pc ejecute eso?

PD: el comando "r", sirve para leer archivos ya existentes quizá es eso.En todo caso poner el "w" antes que la r para que cree el archivo.


Título: Re: [python] Objetos que se guardan y cargan solos
Publicado por: lnvisible en 7 Diciembre 2010, 07:07 am
No, lo que quiero es que el objeto se almacene a si mismo (y no a otro) en un fichero, y que cuando vuelva a crear un objeto de esa clase no haga uno nuevo sino que lo cargue del fichero.

No puedo usar r como dices porque crearía el fichero vacío y daría un error, porque necesito que tenga un contador con un numero, ese numero se tiene que ir incrementando cada vez que se llame al script.


Título: Re: [python] Objetos que se guardan y cargan solos
Publicado por: Novlucker en 7 Diciembre 2010, 12:27 pm
Buenas.

Lo que ocurre es que en realidad self no significa nada para Python, self se utiliza por convención, por lo cual, cuando tu haces esto ...
Código
  1. self = load(f)

... lo único que estas haciendo es modificar el valor de la variable, si pones un string, entonces será un string, pero eso no significa que el objeto ha cambiado porque de por si no es un puntero a memoria.
Lo que debes de hacer es modificar los atributos del objeto actual, con los atributos del objeto cargado :P
Código
  1. from pickle import load, dump
  2.  
  3. class Auto:
  4.  def __init__(self):
  5.    try:
  6.      self.load()
  7.    except:
  8.      self.counter = 0
  9.  
  10.  def load(self):
  11.    with open(self.__class__.__name__, 'rb') as f:
  12.      self.__dict__ = load(f).__dict__
  13.  
  14.  def dump(self):
  15.    with open(self.__class__.__name__, 'wb') as f:
  16.      dump(self, f)
  17.  
  18. class Test(Auto):
  19.  def increment(self):
  20.    self.counter += 1
  21.    print(self.counter)
  22.    self.dump()
  23.  
  24. if __name__ == "__main__":
  25.  t = Test()
  26.  t.increment()

Saludos


Título: Re: [python] Objetos que se guardan y cargan solos
Publicado por: lnvisible en 8 Diciembre 2010, 06:26 am
GRacias!! Estaba probando con getattr y setattr pero me daba un error de weakref o algo parecido : \

He hecho otras cosillas, al final me ha quedado esto :)

Código
  1. #!/usr/bin/env python3
  2. from pickle import load, dump
  3. from os.path import exists
  4.  
  5. class Auto:
  6.  def __init__(self):
  7.    if (exists(self.__class__.__name__)):
  8.      self.load()
  9.    else:
  10.      self.start()
  11.      self.dump()
  12.  
  13.  def start(self):
  14.    pass
  15.  
  16.  def load(self):
  17.    with open(self.__class__.__name__, 'rb') as f:
  18.      self.__dict__ = load(f).__dict__
  19.  
  20.  def dump(self):
  21.    with open(self.__class__.__name__, 'wb') as f:
  22.      dump(self, f)
  23.  
  24.  def __enter__(self):
  25.    if (exists(self.__class__.__name__)):
  26.      self.load()
  27.    return self
  28.  
  29.  def __exit__(self, extype, exvalue, traceback):
  30.    if (None == extype == exvalue == traceback):
  31.      self.dump()
  32.    else:
  33.      print('oh oh...')
  34.  
  35.  
  36. class Test(Auto):
  37.  def start(self):
  38.    self.counter = 0
  39.  
  40.  def increment(self):
  41.    self.counter += 1
  42.    print(self.counter)
  43.  
  44.  
  45. if __name__ == "__main__":
  46.  with Test() as t:
  47.    t.increment()

Lo que pasa es que quiero que la clase general tenga todo lo posible, para hacer comodamente las hijas ;) que ahora son persistentes :D