所以,我有一个对象有很多不可拾取的东西(pygame事件,orderedDicts,时钟等),我需要将它保存到磁盘。
事情是,如果我能得到这个东西来存储一个有进展的字符串(我只需要一个整数),那么我可以将它传递给对象的init,它将重建所有这些东西。不幸的是,我正在使用的框架(Renpy)将挑选对象并尝试加载它,尽管事实上我可以将它保存为单个整数,但我无法改变它。
所以,我要问的是,如何覆盖方法,以便每当pickle尝试保存对象时,它只保存进度值,并且每当它尝试加载对象时,它都会创建一个新的实例。进步值?
我已经看过一些关于__repr__方法的讨论,但我不确定如何在我的情况下使用它。
答案 0 :(得分:6)
你正在寻找的钩子是__reduce__
。它应该返回一个(callable, args)
元组; callable
和args
将被序列化,在反序列化时,将通过callable(*args)
重新创建对象。如果类的构造函数采用int,则可以将__reduce__
实现为
class ComplicatedThing(object):
def __reduce__(self):
return (ComplicatedThing, (self.progress_int,))
你可以在元组中添加一些额外的东西,主要用于当你的对象图有循环依赖时,但你不需要它们。