我希望我的班级实现保存和加载功能,这些功能只是对班级进行腌制。但是显然您不能以以下方式使用“自我”。你该怎么做?
self = cPickle.load(f)
cPickle.dump(self,f,2)
Answers:
这就是我最终要做的。更新__dict__
方法是,我们保留我添加到类中的所有新成员变量,并仅更新上次腌制对象时存在的成员变量。在类本身内部维护保存和加载代码时,这似乎是最简单的,因此调用代码仅执行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()
merge
。您应该在致电self.__dict__.clear()
之前致电self.__dict__.update(..)
转储部分应按您的建议工作。对于加载部分,您可以定义一个@classmethod,它从给定文件加载实例并返回它。
@classmethod
def loader(cls,f):
return cPickle.load(f)
那么调用者将执行以下操作:
class_instance = ClassName.loader(f)
如果您想让自己的班级从已保存的泡菜中进行更新……您几乎必须使用__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()
>>> t.x = 1
>>> _t = t.save()
>>> t.x = 2
>>> t.x
2
>>> t.load(_t)
>>> t.x
1
我曾经loads
和dumps
代替load
和dump
,因为我想泡菜保存到一个字符串。对文件使用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)
...
>>> t.x
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
这就是我的方法。优点是您无需创建新对象。您可以直接加载它。
def save(self):
with open(self.filename, 'wb') as f:
pickle.dump(self, f)
@classmethod
def load(cls, filename):
with open(filename, 'rb') as f:
return pickle.load(f)
如何使用它:
class_object.save()
filename = class_object.filename
del class_object
class_object = ClassName.load(filename)