Python Pickle:同时使用uuu getstate_uuu和uuu getnewargs__
我在Python2.7上使用pickle。我正在尝试调用两个方法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
\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 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}