2016-03-03 54 views
1

我想腌出对象列表中的对象包含列表。当我打开腌制文件时,除了列表外,我可以看到我的对象中的任何数据。我在下面放置代码,这样更有意义。蟒蛇泡菜不保存整个对象

包含列表的对象。

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) 

这里是我的打开文件腌制,并试图访问的示例数据,我只能从上面检索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 [] 

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

回答

2

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

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

所以,当你访问result.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 
+0

谢谢,就是这样。 – user1904898