簡體   English   中英

Pickle:同時使用__getstate__和__getnewargs__

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM