如何腌制自己?
我想让我的类实现保存和加载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
我用loads
和dumps
而不是load
和dump
因为我希望酱菜保存到一个string。 使用load
和dump
文件也可以。 而且,实际上,我可以使用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它呢?