如何腌制自己?

我想让我的类实现保存和加载function,只是简单地做一个类的腌菜。 但显然你不能用下面的方式来使用“自我”。 你怎么能这样做?

self = cPickle.load(f) cPickle.dump(self,f,2) 

这是我最终做的。 更新__dict__意味着我们保留所有添加到类中的新成员variables,只是在对象最后一次被pickle时更新那些variables。 看起来最简单的方法是在类中保存保存和加载代码,所以调用代码只需要一个object.save()。

 def load(self): f = open(self.filename, 'rb') tmp_dict = cPickle.load(f) f.close() self.__dict__.update(tmp_dict) def save(self): f = open(self.filename, 'wb') cPickle.dump(self.__dict__, f, 2) f.close() 

转储部分应按照您的build议工作。 对于加载部分,您可以定义一个@classmethod从给定文件加载实例并返回它。

 @classmethod def loader(cls,f): return cPickle.load(f) 

那么调用者会做这样的事情:

 class_instance = ClassName.loader(f) 

如果你想让你的类从一个保存的pickle中更新自己,你几乎必须使用__dict__.update ,就像你自己的答案一样。 这有点像一只猫追逐它的尾巴,但是…因为你要求这个实例本质上“重置”自己与以前的状态。

你的答案有一些微调。 你实际上可以腌制self

 >>> import dill >>> class Thing(object): ... def save(self): ... return dill.dumps(self) ... def load(self, obj): ... self.__dict__.update(dill.loads(obj).__dict__) ... >>> t = Thing() >>> tx = 1 >>> _t = t.save() >>> tx = 2 >>> tx 2 >>> t.load(_t) >>> tx 1 

我用loadsdumps而不是loaddump因为我希望酱菜保存到一个string。 使用loaddump文件也可以。 而且,实际上,我可以使用dill将一个类实例腌制到一个文件中,以供以后使用…即使这个类是交互式定义的。 从上面继续…

 >>> with open('self.pik', 'w') as f: ... dill.dump(t, f) ... >>> 

然后停止并重新启动…

 Python 2.7.10 (default, May 25 2015, 13:16:30) [GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import dill >>> with open('self.pik', 'r') as f: ... t = dill.load(f) ... >>> tx 1 >>> print dill.source.getsource(t.__class__) class Thing(object): def save(self): return dill.dumps(self) def load(self, obj): self.__dict__.update(dill.loads(obj).__dict__) >>> 

我正在使用dill ,这是可用的: https : //github.com/uqfoundation

这里有一个如何在文档中腌制实例的例子。 (向下search“TextReader”示例)。 这个想法是定义__getstate____setstate__方法,它们允许你定义哪些数据需要被__setstate__ ,以及如何使用这些数据重新实例化对象。

如何编写一个名为Serializable的类来实现转储和加载,并让你的类inheritance它呢?