Python Pickle:同时使用uuu getstate_uuu和uuu getnewargs__

Python Pickle:同时使用uuu getstate_uuu和uuu getnewargs__,python,python-2.7,pickle,Python,Python 2.7,Pickle,我在Python2.7上使用pickle。我正在尝试调用两个方法\uuu getstate\uu和我重写的\uu getnewargs\uu。我不能pickle属性c,因为它是classeD的一个实例 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 cal

我在Python2.7上使用pickle。我正在尝试调用两个方法
\uuu getstate\uu
和我重写的
\uu getnewargs\uu
。我不能pickle属性
c
,因为它是classe
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}
我没有看到对
\uu getnewargs\uuu
的调用,这些调用本应创建属性
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号议定书

以及:

如果省略协议参数,则使用协议0

因此,必须将pickle协议显式设置为2,如下所示:

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

谢谢工作完美。它按预期返回调用了getnewargs
调用了getstate
调用了setstate
{a':7,'c':,'b':2,'d':1}