Pickle:同时使用\uugestate和\uugetnewargs__

2024-09-29 01:30:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python2.7上使用pickle。我试图调用我重写的__getstate__和{}两个方法。我不能pickle属性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__

退货:

^{pr2}$

我看不到应该创建属性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)

Tags: self属性savedefnnopenpickledict
1条回答
网友
1楼 · 发布于 2024-09-29 01:30:46

docs

New-style types can provide a getnewargs() method that is used for protocol 2.

对于^{}

If the protocol parameter is omitted, protocol 0 is used.

因此,协议2必须明确设置为:

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

相关问题 更多 >