2017-04-21 79 views
1

我用鹹菜的Python 2.7版。我正在嘗試調用我忽略的方法__getstate____getnewargs__。我不能鹹菜屬性c,因爲它是CLASSE D的實例。味酸:同時使用__getstate__和__getnewargs__

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} 

我看沒有哪個有前人的精力創建的屬性c__getnewargs__電話。

我的代碼:

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) 

回答

0

docs

新式類型可以提供用於 協議的getnewargs()方法2.

而對於pickle.dump

如果省略了協議參數,協議0被使用。

因此,你必須鹹菜協議明確設置爲2,像這樣:

pickle.dump(nn, open('c_save.p', 'wb'), protocol=2) 
+0

謝謝!完美的作品。它如預期般返回 'getnewargs被稱爲' 'getstate被稱爲' 'setstate被稱爲' '{'a':7,'c':<__ main __。D object at 0x7fd1bd8c1710>,'b':2, 'd':1}' – JulesKzl