自定义腌制数据

有些数据无法腌制。其他数据不应因其他原因而被腌制。

可以在 __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__ 在调用时初始化的所有内容。