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. _______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python