Hola, estoy aprendiendo python y quiero hacer que un objeto se guarde y cargue solo, y sus subclases también. Tengo esto:
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!!
¿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.
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.
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 ...
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
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
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 :)
#!/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