我有一个类,其中方法save
使用pickle包将创建的对象存储到磁盘:
def save(
self,
filepath,
):
#CHECK ATTRIBUTE VALUES
pickle_out = open(filepath+'.pickle', 'wb')
pickle.dump(self, pickle_out)
pickle_out.close()
类似地,我想添加一个load
方法,该方法加载一个pickle文件并用加载的属性更新对象。
在我的加载方法中,我使用了:
infile = open(filepath,'rb')
self = pickle.load(infile)
infile.close()
但是,这不会更新类属性。如何编写一个加载方法来更新类变量?
当不使用C扩展或插槽时,类实例数据存储在字典中。你可以解开这个类并替换那个字典。
import pickle
class Foo:
def __init__(self, val):
self.val = val
def save(self, filepath):
with open(filepath,'wb') as outfile:
pickle.dump(self, outfile)
def load(self, filepath):
with open(filepath,'rb') as infile:
self.__dict__ = pickle.load(infile).__dict__
f1 = Foo(1)
f1.save("test.pkl")
del f1
f2 = Foo(2)
print(f2.val)
f2.load("test.pkl")
print(f2.val)
仅pickleself.__dict__
是有意义的,因为它是感兴趣的唯一数据。
与使用pickle的正常方式相比,我看不出这有任何好处——让正则函数或静态方法加载并返回pickle对象。这就是泡菜的用途。