我希望我的类能够实现Save和Load函数,这些函数只是简单地修改了类.但显然你不能在下面的时尚中使用'self'.你怎么能这样做?
self = cPickle.load(f)
cPickle.dump(self,f,2)
Run Code Online (Sandbox Code Playgroud)
小智 41
这就是我最终做的事情.更新这__dict__意味着我们保留我添加到类中的任何新成员变量,并只更新上次pickle对象时那些变量.这似乎是最简单的,同时在类本身内部保存和加载代码,因此调用代码只需要一个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()
Run Code Online (Sandbox Code Playgroud)
Ofr*_*viv 21
转储部分应该按照您的建议工作.对于加载部分,您可以定义一个@classmethod,它从给定文件加载实例并返回它.
@classmethod
def loader(cls,f):
return cPickle.load(f)
Run Code Online (Sandbox Code Playgroud)
然后调用者会做类似的事情:
class_instance = ClassName.loader(f)
Run Code Online (Sandbox Code Playgroud)
如果你想让你的课程从保存的泡菜中更新......你几乎必须使用__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
Run Code Online (Sandbox Code Playgroud)
我曾经loads和dumps代替load和dump,因为我想泡菜保存到一个字符串.使用load和dump到文件也有效.而且,实际上,我可以使用dill将类实例挑选到文件中,以供以后使用...即使该类是以交互方式定义的.继续从上面......
>>> with open('self.pik', 'w') as f:
... dill.dump(t, f)
...
>>>
Run Code Online (Sandbox Code Playgroud)
然后停止并重新启动......
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__)
>>>
Run Code Online (Sandbox Code Playgroud)
我正在使用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)
Run Code Online (Sandbox Code Playgroud)
如何使用它:
class_object.save()
filename = class_object.filename
del class_object
class_object = ClassName.load(filename)
Run Code Online (Sandbox Code Playgroud)
下面,我用一个完全有效的最小示例更新了答案。这可以根据您自己的需要进行调整。
import pickle
class Test:
def __init__(self, something, filename) -> None:
self.something = something
self.filename = filename
def do_something(self) -> None:
print(id(self))
print(self.something)
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)
test_object = Test(44, "test.pkl")
test_object.do_something()
test_object.save()
filename = test_object.filename
del test_object
recovered_object = Test.load(filename)
recovered_object.do_something()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16130 次 |
| 最近记录: |