自定义腌制数据
有些数据无法腌制。其他数据不应因其他原因而被腌制。
可以在 __getstate__
方法中定义将被腌制的内容。此方法必须返回可选择的内容。
在对立方面是 __setstate__
:它将接收 __getstate__
创建的内容并且必须初始化对象。
class A(object):
def __init__(self, important_data):
self.important_data = important_data
# Add data which cannot be pickled:
self.func = lambda: 7
# Add data which should never be pickled, because it expires quickly:
self.is_up_to_date = False
def __getstate__(self):
return [self.important_data] # only this is needed
def __setstate__(self, state):
self.important_data = state[0]
self.func = lambda: 7 # just some hard-coded unpicklable function
self.is_up_to_date = False # even if it was before pickling
现在,这可以做到:
>>> a1 = A('very important')
>>>
>>> s = pickle.dumps(a1) # calls a1.__getstate__()
>>>
>>> a2 = pickle.loads(s) # calls a1.__setstate__(['very important'])
>>> a2
<__main__.A object at 0x0000000002742470>
>>> a2.important_data
'very important'
>>> a2.func()
7
这里的实现带有一个值列表:[self.important_data]
。这只是一个例子,__getstate__
可以返回任何可选择的东西,只要 __setstate__
知道如何做 oppoisite。一个很好的选择是所有值的字典:{'important_data': self.important_data}
。
没有调用构造函数! 请注意,在前面的示例实例中,a2
是在 pickle.loads
中创建的,没有调用 A.__init__
,所以 A.__setstate__
必须初始化 __init__
在调用时初始化的所有内容。