【问题标题】:Python Pickle not saving entire objectPython Pickle 不保存整个对象
【发布时间】:2016-06-17 11:18:08
【问题描述】:

我试图挑选出一个对象列表,其中对象包含一个列表。当我打开腌制文件时,我可以在我的对象中看到除列表之外的任何数据。我将代码放在下面,这样更有意义。

包含列表的对象。

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 []

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

【问题讨论】:

    标签: python object serialization pickle


    【解决方案1】:

    testNumber 和 testList 最初都是类属性。 testNumber 是不可变类型,因此修改它会创建新的实例属性,但 testList 是可变类型,可以就地修改。因此修改 testList 不会创建新的实例属性,它仍然是类属性。 你可以验证一下 -

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

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

    解决方案

    您将实例存储在泡菜中,因此请使用实例属性。修改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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-14
      • 2011-06-02
      • 1970-01-01
      相关资源
      最近更新 更多