Pickle con clases personalizadas.

Supongamos que tengo una definición de clase python simple en un archivo myClass.py

class Test: A = [] 

Y también tengo dos guiones de prueba. La primera secuencia de comandos crea un objeto de tipo Prueba, rellena la matriz A y esconde el resultado en un archivo. Inmediatamente lo quita del archivo y la matriz aún se rellena. La segunda secuencia de comandos simplemente se elimina del archivo y la matriz no se rellena (es decir, A == []). ¿Por qué es esto?

test1.py

 import myClass import pickle x = myClass.Test() for i in xrange(5): xAappend(i) f = open('data', 'w') pickle.dump(x,f) f.close() f = open('data') y = pickle.load(f) f.close print yA 

y test2.py

 import myClass import pickle f = open('data') y = pickle.load(f) f.close print yA 

Se debe a que está configurando Test.A como un atributo de clase en lugar de un atributo de instancia. Realmente, lo que está sucediendo es que con el test1.py, el objeto que se lee del archivo pickle es el mismo que el test2.py, pero usa la clase en la memoria a la que originalmente asignó xA .

Cuando se desalojan sus datos del archivo, se crea una nueva instancia del tipo de clase y, a continuación, se aplica cualquier dato de instancia que necesite. Pero tu única información era un atributo de clase. Siempre hace referencia a la clase que está en la memoria, que modificaste en uno, pero no en otro archivo.

Compara las diferencias en este ejemplo:

 class Test: A = [] # a class attribute def __init__(self): self.a = [] # an instance attribute 

Notará que el atributo de instancia a será decapado y no seleccionado apropiadamente, mientras que el atributo de clase A simplemente se referirá a la clase en memoria.

 for i in xrange(5): xAappend(i) xaappend(i) with open('data', 'w') as f: pickle.dump(x,f) with open('data') as f: y = pickle.load(f) >>> yA [0, 1, 2, 3, 4] >>> ya [0, 1, 2, 3, 4] >>> Test.A [0, 1, 2, 3, 4] >>> Test.A = [] # resetting the class attribute >>> ya [0, 1, 2, 3, 4] >>> yA # refers to the class attribute []