自定義醃製資料
有些資料無法醃製。其他資料不應因其他原因而被醃製。
可以在 __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__
在呼叫時初始化的所有內容。