Python Pickle 不保存整个对象

标签 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)

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

我认为我在这里遗漏了一些明显的东西,但我没有运气发现它。感谢您的指导。

最佳答案

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

关于Python Pickle 不保存整个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35783898/

相关文章:

postgresql - eclipselink + @convert(json) + postgres + 列表属性

java - 在 OSGI 环境中 com.hazelcast.nio.serialization.HazelcastSerializationException

python - 为什么 str.format() 比 str() 更好?

Python 游戏 "House of Cards"需要帮助

方法调用模式中的 Javascript "this"指针未指向对象

javascript - 迭代 Mongoose findById

python - 模块 jupyter-vuetify semver 范围未注册为小部件模块

python - 不同版本代码的均值归一化

python - Conda setuptools install 将 shebangs 更改为默认 python 安装

c++ - Qt 类型的标准文本表示是什么?