Python Pickle 没有保存整个对象
Python Pickle not saving entire object
我正在尝试挑选出一个对象列表,其中对象包含一个列表。当我打开 pickled 文件时,我可以看到我的对象中除列表之外的任何数据。我将代码放在下面,这样更有意义。
包含列表的对象。
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)
这是我打开 pickled 文件并尝试访问数据的示例,我只能从上面检索 testNumber,testList returns 一个空列表。
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 []
我想我在这里遗漏了一些明显的东西,但我没有找到它。感谢您的指导。
testNumber
和 testList
最初都是 class 属性。 testNumber
是不可变类型,因此修改它会创建新的实例属性,但是 testList
是可变类型,可以就地修改。因此修改 testList
不会创建新的实例属性,它仍然是 class 属性。
你可以验证一下 -
print testPKL.__dict__
{'testNumber': 12}
print result.__dict__
{'testNumber': 12}
因此,当您访问 result.testList
时,它会查找 class 属性 TestPickle.testList
,在您的例子中是 []。
解决方案
您正在 pickle 中存储实例,因此请使用实例属性。修改TestPickle
class如下-
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
我正在尝试挑选出一个对象列表,其中对象包含一个列表。当我打开 pickled 文件时,我可以看到我的对象中除列表之外的任何数据。我将代码放在下面,这样更有意义。
包含列表的对象。
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)
这是我打开 pickled 文件并尝试访问数据的示例,我只能从上面检索 testNumber,testList returns 一个空列表。
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 []
我想我在这里遗漏了一些明显的东西,但我没有找到它。感谢您的指导。
testNumber
和 testList
最初都是 class 属性。 testNumber
是不可变类型,因此修改它会创建新的实例属性,但是 testList
是可变类型,可以就地修改。因此修改 testList
不会创建新的实例属性,它仍然是 class 属性。
你可以验证一下 -
print testPKL.__dict__
{'testNumber': 12}
print result.__dict__
{'testNumber': 12}
因此,当您访问 result.testList
时,它会查找 class 属性 TestPickle.testList
,在您的例子中是 []。
解决方案
您正在 pickle 中存储实例,因此请使用实例属性。修改TestPickle
class如下-
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