[Python] pickle di una classe derivata

Marco Giusti marco.giusti a gmail.com
Mer 5 Dic 2012 10:05:21 CET


On Wed, Dec 05, 2012 at 12:04:54AM +0100, Simone Ziraldo wrote:
> Ciao a tutti,
> 
> il problema che ho è questo: quando faccio il pickle di una classe derivata di numpy.ndarray non mi salva gli attributi che ho definito io.
> Un codice semplice che genera questo problema è questo:
> 
> import pickle
> import numpy
> 
> class prova( numpy.ndarray ):
>     def __new__(cls,size):
>         return numpy.ndarray.__new__( cls, size )
>     def __init__(self,size ):
>         self.__size__ = size
> 
> s = prova(2)
> 
> f = open("prova.out", 'w')
> pickle.dump(s,f)
> f.close()
> 
> f = open("prova.out", 'r')
> obj = pickle.load(f)
> f.close
> 
> print obj.__size__
> 
> e mi viene restituito questo errore:
> AttributeError: 'prova' object has no attribute '__size__'

	>>> class prova2(numpy.ndarray):
	...  def __init__(self, size):
	...   numpy.ndarray.__init__(self, size)
	...   self.__size__ = size
	...  def __reduce__(self):
	...   t = numpy.ndarray.__reduce__(self)
	...   klass, args = t[:2]
	...   func, args = t[:2]
	...   return (reconstruct, (func, args, self.__size__)) + t[2:]
	...
	>>> def reconstruct(f, args, size):
	...  o = f(*args)
	...  o.__size__ = size
	...  return o
	...
	>>> p3 = pickle.loads(pickle.dumps(p2))
	>>> p3
	prova2([  6.90286283e-310,   6.90286283e-310,   1.58101007e-322])
	>>> p3.__dict__
	{'__size__': 3}
	>>> 

la documentazione su pickle spiega tutto

ciao
m.


Maggiori informazioni sulla lista Python