Могу ли я пометить переменные как переходные, чтобы они не были маринованными?
Скажем, у меня есть класс:
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
был маринован.
Можно ли пометить кеш-карту как изменчивую/переходную/непонятную?
Ответы
Ответ 1
Согласно документации Pickle, вы можете предоставить метод под названием __getstate__()
, который возвращает что-то, представляющее состояние, которое вы хотите смазать (если оно не если pickle
использует thing.__dict__
). Итак, вы можете сделать что-то вроде этого:
class Thing:
def __getstate__(self):
state = dict(self.__dict__)
del state['cachedBar']
return state
Это не должно быть dict, но если это что-то еще, вам также нужно реализовать __setstate__(state)
.
Ответ 2
Внесите __getstate__
, чтобы вернуть только те части объекта, который будет маринован