python cPickle不保存类列表

时间:2012-07-06 05:56:03

标签: python serialization pickle

import cPickle

class player:
    level = 1
    exp = 0
    inven = []

char = player()

#Append items to char.inven later in program

def save():
    file = open('savegame.dat', 'w')
    cPickle.dump(char, file)

def load():
    s_g = open('savegame.dat', 'r')
    char = cPickle.load(s_g)
    s_g.close()

这是实际代码的一小部分,我将其剪切下来以显示它出错的地方。

当我保存/加载它时,它不会将项目保留在char.inven中,即使我专门将列表转储到文件中也是如此。知道为什么它会删除列表的项目吗?

另外,如果我在转储之前加入列表,它会保存它。但是一些列表项是2个单词,所以list.split()使它与之前不同

1 个答案:

答案 0 :(得分:3)

inven是类的属性,而不是实例。 Pickle没有保存关于课程的任何内容;它只存储类的名称以便稍后重新实例化。我猜你不希望inven成为一个类属性,所以你应该这样做:

class player:
    def __init__(self):
        self.level = 1
        self.exp = 0
        self.inven = []

编辑:如果您看到level已保存,则可能是因为您正在重新绑定它。例如,如果您有代码执行此操作:

self.level += 1

您没有增加class属性。您正在创建新的实例属性。每当你有一个实例obj而你做obj,attr = ...时,就会创建一个实例属性,而不是一个类属性。

你没有看到与发明相同的效果的原因是因为你可能正在改变它(例如,使用self.inven.append(...))而不是重新绑定它。因此,您永远不会创建实例属性,只需继续修改类属性。

您应该在StackOverflow上搜索有关类与实例属性(有时也称为类和实例变量)的问题,以了解它在Python中的工作原理。