Python - 如何使这个不可拾取的对象成为可选择的?

时间:2015-06-07 23:08:17

标签: python save pygame pickle renpy

所以,我有一个对象有很多不可拾取的东西(pygame事件,orderedDicts,时钟等),我需要将它保存到磁盘。

事情是,如果我能得到这个东西来存储一个有进展的字符串(我只需要一个整数),那么我可以将它传递给对象的init,它将重建所有这些东西。不幸的是,我正在使用的框架(Renpy)挑选对象并尝试加载它,尽管事实上我可以将它保存为单个整数,但我无法改变它。

所以,我要问的是,如何覆盖方法,以便每当pickle尝试保存对象时,它只保存进度值,并且每当它尝试加载对象时,它都会创建一个新的实例。进步值?

我已经看过一些关于__repr__方法的讨论,但我不确定如何在我的情况下使用它。

1 个答案:

答案 0 :(得分:6)

你正在寻找的钩子是__reduce__。它应该返回一个(callable, args)元组; callableargs将被序列化,在反序列化时,将通过callable(*args)重新创建对象。如果类的构造函数采用int,则可以将__reduce__实现为

class ComplicatedThing(object):
    def __reduce__(self):
        return (ComplicatedThing, (self.progress_int,))

你可以在元组中添加一些额外的东西,主要用于当你的对象图有循环依赖时,但你不需要它们。