Python Pickle不保存整个对象

时间:2016-03-03 22:00:06

标签: python object serialization pickle

我正在尝试挑选出对象包含列表的对象列表。当我打开pickle文件时,我可以在列表中看到我的对象中的任何数据。我把代码放在下面所以这更有意义。

包含列表的对象。

class TestPickle:
    testNumber = None
    testList = []

    def addNumber(self, value):
        self.testNumber = value
    def getNumber(self):
        return self.testNumber

    def addTestList(self, value):
        self.testList.append(value)
    def getTestList(self):
        return self.testList

这个例子我创建了一个上面对象的列表(我正在添加一个对象以保持简短)

testPKL = TestPickle()
testList = []
testPKL.addNumber(12)
testPKL.addTestList(1)
testPKL.addTestList(2)
testList.append(testPKL)

with open(os.path.join(os.path.curdir, 'test.pkl'), 'wb') as f:
    pickle.dump(testList, f)

以下是我打开pickle文件并尝试访问数据的示例,我只能从上面检索testNumber,testList返回一个空列表。

pklResult = None
with open(os.path.join(os.path.curdir, 'test.pkl'), 'rb') as f:
    pklResult = pickle.load(f)

for result in pklResult:
    print result.getNumber() # returns 12
    print result.testNumber  # returns 12
    print result.getTestList() # returns []
    print result.testList      # returns []

我想我在这里遗漏了一些明显的东西,但我没有发现运气。感谢您提供任何指导。

1 个答案:

答案 0 :(得分:2)

testNumbertestList最初都是类属性。 testNumber是不可变类型,因此修改它会创建新的实例属性,但testList是可变类型的,可以在适当的位置进行修改。因此,修改testList不会创建新的实例属性,它仍然是类属性。 你可以验证它 -

print testPKL.__dict__
{'testNumber': 12}
print result.__dict__
{'testNumber': 12}

因此,当您访问result.testList时,它会查找类属性TestPickle.testList,在您的情况下为[]。

解决方案

您正在pickle中存储实例,因此请使用实例属性。修改TestPickle课程如下 -

class TestPickle:
    def __init__(self):
        self.testNumber = None
        self.testList = []

    def addNumber(self, value):
        self.testNumber = value
    def getNumber(self):
        return self.testNumber

    def addTestList(self, value):
        self.testList.append(value)
    def getTestList(self):
        return self.testList