Can I mark variables as transient so they won'

2019-02-06 09:03发布

Let's say I have a class:

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

To get bar some intense calculation, so I cache it in memory to speed things up.

However, when I pickle one of these classes I don't want cachedBar to be pickled.

Can I mark cachedBar as volatile / transient / not picklable?

标签: python pickle
2条回答
贼婆χ
2楼-- · 2019-02-06 09:34

Implement __getstate__ to return only what parts of an object to be pickled

查看更多
forever°为你锁心
3楼-- · 2019-02-06 09:50

According to the Pickle documentation, you can provide a method called __getstate__(), which returns something representing the state you want to have pickled (if it isn't provided, pickle uses thing.__dict__). So, you can do something like this:

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

This doesn't have to be a dict, but if it is something else, you need to also implement __setstate__(state).

查看更多
登录 后发表回答