[英]Pickle : using both __getstate__ and __getnewargs__
我在python 2.7上使用pickle。 我正在嘗試調用兩個我都覆蓋的方法__getstate__
和__getnewargs__
。 我不能腌制屬性c
因為它是D
的實例。
nn = C(7, 2)
nn.d = 1
pickle.dump(nn, open('c_save.p', 'wb'))
nn2 = pickle.load(open('c_save.p', 'rb'))
print nn2.__dict__
返回值:
getstate was called
setstate was called
{'a': 7, 'b': 2, 'd': 1}
我看不到__getnewargs__
調用,該調用已創建屬性c
。
我的代碼:
import pickle
class D(object):
def __init__(self, i, j):
self.i = i
self.j = j
class C(object):
def __init__(self, a, b):
self.a = a
self.b = b
self.c = D(a, b)
self.d = 0
def __getstate__(self):
print 'getstate was called'
odict = self.__dict__.copy()
del odict['c']
return odict
def __getnewargs__(self):
print 'getnewargs was called'
return (self.b,self.a)
def __setstate__(self, dict):
print 'setstate was called'
self.__dict__.update(dict)
從文檔 :
新型可以提供用於協議2的getnewargs ()方法。
對於pickle.dump
:
如果省略協議參數,則使用協議0。
因此,您必須像下面這樣將pickle協議顯式設置為2:
pickle.dump(nn, open('c_save.p', 'wb'), protocol=2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.