我可以将变量标记为瞬态以防止它们被序列化吗?

16 投票
2 回答
4919 浏览
提问于 2025-04-16 19:21

假设我有一个类:

class Thing(object):
    cachedBar = None

    def __init__(self, foo):
        self.foo = foo

    def bar(self):
        if not self.cachedBar:
            self.cachedBar = doSomeIntenseCalculation()
        return self.cachedBar

为了得到一些复杂的计算结果,我把它存储在内存中,这样可以加快速度。

但是,当我把这个类进行序列化(也就是把它转换成可以保存或传输的格式)时,我不想把 cachedBar 这个数据也一起保存。

我可以把 cachedBar 标记为不需要保存吗?

2 个回答

3

实现 __getstate__ 方法,用来返回一个对象中哪些部分需要被保存(也就是“打包”)

26

根据Pickle的文档,你可以提供一个叫做__getstate__()的方法,这个方法会返回一个表示你想要保存状态的东西(如果你不提供这个方法,pickle会使用thing.__dict__)。所以,你可以这样做:

class Thing:
      def __getstate__(self):
            state = dict(self.__dict__)
            del state['cachedBar']
            return state

这个返回的东西不一定非得是字典,但如果你返回的是其他类型的东西,你还需要实现一个叫__setstate__(state)的方法。

撰写回答