Ver Mensaje Individual
  #1 (permalink)  
Antiguo 13/12/2016, 13:26
Koan
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 3 meses
Puntos: 9
Como guardar y recuperar una instancia (y sus estados) con pickle?

Hola de nuevo!

Algo que creia sencillo, se me esta complicando o yo no pillo el concepto. Con el modulo pickle de Python se pueden guardar o serializar objetos. Ya lo probe en su dia con listas o objetos de ese tipo. La cosa es que pensaba que se podria realizar igualmente con objetos (instancias) creadas por nosotros. Y quizas se pueda, pero no doy con la tecla.

La idea es crear una clase y de ella instanciar un objeto simple. Con un estado basico. Luego lo grabamos en disco con el modulo pickle y cuando le deseamos recuperar debe volver con ese estado.

Algo simple seria asi:

Código Python:
Ver original
  1. class Humano:
  2.     def __init__(self, nombre):
  3.         self.nombre = nombre
  4.     def mostrarNombre(self):
  5.         print(self.nombre)

Instanciamos:

Código Python:
Ver original
  1. persona = Humano('John')

Y yo pensaba que haciendo esto se guardaba el objeto/instancia:

Código Python:
Ver original
  1. with open('objeto.bin', 'wb') as fichero:
  2.     pickle.dump(persona, fichero)

Que ciertamente se guarda, aunque no se bien que. Ya que al leerlo de esta manera (seguro que incorrecta por mi parte) no me devuelve el objeto grabado en disco:

Código Python:
Ver original
  1. with open('objeto.bin', 'rb') as persona:
  2.     pickle.load(persona)

En todo caso me devuelve:

Código Python:
Ver original
  1. <_io.BufferedReader name='objeto.bin'>

Intuyo incrongruencias en el uso de pickle por mi parte. Pero no se bien como recuperar el objeto con sus estados de nuevo. O como de deberia modificar el codigo para guardar y recuperar dicha instancia con sus estados que fueron grabados.

Imaginemos que modificamos el objeto:

Código Python:
Ver original
  1. persona.nombre = 'Juan'

Pues me gustaria que al hacer el load con pickle el atributo de nombre volviera a ser 'John' que fue como se grabo a disco ¿Esto se puede hacer?

Gracias!

EDITO:

Podria ser una posible solucion asignar al metodo load de pickle el nombre el objeto asi?

Código Python:
Ver original
  1. with open('objeto.bin', 'rb') as fichero:
  2.     persona = pickle.load(fichero)

Última edición por Koan; 13/12/2016 a las 14:31 Razón: Posible solucion?