所以,我有一个对象,里面有很多不可 pickle 的东西(pygame 事件、orderedDicts、时钟等),我需要将它保存到磁盘。
事情是,如果我可以让这个东西存储一个有进度的字符串(我只需要一个整数),那么我可以将它传递给对象的 init,它会重建所有这些东西。不幸的是,我正在使用的框架 (Renpy) 将 pickle 对象并尝试加载它,尽管我可以将它保存为单个整数,但我无法更改它。
所以,我要问的是,我如何覆盖方法,以便每当 pickle 尝试保存对象时,它只保存进度值,而每当它尝试加载对象时,它从进度值?
我看过一些关于 __repr__ 方法的讨论,但我不确定在我的情况下如何使用它。
最佳答案
您要找的钩子(Hook)是__reduce__
.它应该返回一个 (callable, args)
元组; callable
和 args
将被序列化,反序列化时,对象将通过 callable(*args)
重新创建。如果您的类的构造函数采用 int,则可以将 __reduce__
实现为
class ComplicatedThing:
def __reduce__(self):
return (ComplicatedThing, (self.progress_int,))
您可以将一些可选的额外内容放入元组中,当您的对象图具有循环依赖性时最有用,但您在这里不需要它们。
关于Python - 如何使这个不可 pickle 的对象可 pickle ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30699391/