[python] Objetos que se guardan y cargan solos

Iniciado por lnvisible, 6 Diciembre 2010, 23:37 PM

0 Miembros y 1 Visitante están viendo este tema.

lnvisible

Hola, estoy aprendiendo python y quiero hacer que un objeto se guarde y cargue solo, y sus subclases también. Tengo esto:

Código (python) [Seleccionar]
from pickle import load, dump

class Auto:

  def __init__(self):
    try:
      self.load()
    except:
      self.counter = 0

  def load(self):
    with open(self.__class__.__name__, 'rb') as f:
      self = load(f)

  def dump(self):
    with open(self.__class__.__name__, 'wb') as f:
      dump(self, f)

class Test(Auto):
  def increment(self):
    self.counter += 1
    print(self.counter)
    self.dump()

if __name__ == "__main__":
  t = Test()
  t.increment()


¿Hay algo mal?

GRacias!!

ChicoMaravilla

¿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.

lnvisible

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.

Novlucker

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 (python) [Seleccionar]
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 (python) [Seleccionar]
from pickle import load, dump

class Auto:
 def __init__(self):
   try:
     self.load()
   except:
     self.counter = 0

 def load(self):
   with open(self.__class__.__name__, 'rb') as f:
     self.__dict__ = load(f).__dict__

 def dump(self):
   with open(self.__class__.__name__, 'wb') as f:
     dump(self, f)

class Test(Auto):
 def increment(self):
   self.counter += 1
   print(self.counter)
   self.dump()

if __name__ == "__main__":
 t = Test()
 t.increment()


Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

lnvisible

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 (python) [Seleccionar]
#!/usr/bin/env python3
from pickle import load, dump
from os.path import exists

class Auto:
  def __init__(self):
    if (exists(self.__class__.__name__)):
      self.load()
    else:
      self.start()
      self.dump()

  def start(self):
    pass

  def load(self):
    with open(self.__class__.__name__, 'rb') as f:
      self.__dict__ = load(f).__dict__

  def dump(self):
    with open(self.__class__.__name__, 'wb') as f:
      dump(self, f)

  def __enter__(self):
    if (exists(self.__class__.__name__)):
      self.load()
    return self

  def __exit__(self, extype, exvalue, traceback):
    if (None == extype == exvalue == traceback):
      self.dump()
    else:
      print('oh oh...')


class Test(Auto):
  def start(self):
    self.counter = 0

  def increment(self):
    self.counter += 1
    print(self.counter)


if __name__ == "__main__":
  with Test() as t:
    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