我可以将变量标记为瞬态变量,这样它们就不会被腌制吗?

时间:2011-06-11 01:04:00

标签: python pickle

假设我有一个班级:

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标记为volatile / transient / not picklable吗?

2 个答案:

答案 0 :(得分:21)

根据Pickle documentation,您可以提供一种名为__getstate__()的方法,该方法会返回代表您想要腌制的州的内容(如果没有提供,pickle使用thing.__dict__)。所以,你可以这样做:

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

这不一定是dict,但如果是别的,你还需要实现__setstate__(state)

答案 1 :(得分:3)

实施__getstate__仅返回要被腌制的对象的哪些部分