自定義醃製資料

有些資料無法醃製。其他資料不應因其他原因而被醃製。

可以在 __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__ 在呼叫時初始化的所有內容。