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

SCd*_*CdF 16 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
Run Code Online (Sandbox Code Playgroud)

为了得到一些强烈的计算,所以我将它缓存在内存中以加快速度.

但是,当我挑选其中一个类时,我不想cachedBar被腌制.

我可以将cachedBar标记为volatile/transient/not picklable吗?

lvc*_*lvc 23

根据Pickle文档,您可以提供一个名为的方法__getstate__(),该方法返回表示您想要进行pickle的状态(如果未提供,则pickle使用thing.__dict__).所以,你可以这样做:

class Thing:
      def __getstate__(self):
            state = dict(self.__dict__)
            del state['cachedBar']
            return state
Run Code Online (Sandbox Code Playgroud)

这不一定是dict,但如果它是其他东西,你还需要实现__setstate__(state).