Python - 如何使这个不可 pickle 的对象可 pickle ?

标签 python save pygame pickle renpy

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

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

所以,我要问的是,我如何覆盖方法,以便每当 pickle 尝试保存对象时,它只保存进度值,而每当它尝试加载对象时,它从进度值?

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

最佳答案

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

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

您可以将一些可选的额外内容放入元组中,当您的对象图具有循环依赖性时最有用,但您在这里不需要它们。

关于Python - 如何使这个不可 pickle 的对象可 pickle ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30699391/

相关文章:

python - 快速从给定列表中查找字典中的所有键

python - 你能用排序加速 python 中的 "for "循环吗?

python - 接受迭代并返回字符串的函数

c# - 无法从文本框获取更新值

python - MatPlotLib plot_surface : hidden lines appearing in PDF

python - Pygame 弹雨碰撞和残像

python - Pygame 与蒙版碰撞

python - 如何解码python flask中的dataTables Editor表单?

java - 保存用反射修改的类的字节码

python - pygame 检测绘制的圆形 Sprite 是否被单击失败