1
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() 使它与以前不同

4

1 回答 1

3

inven是类的属性,而不是实例。Pickle 没有保存任何关于类的信息。它只是存储类的名称以便稍后重新实例化它。我猜你无论如何都不想inven成为一个类属性,所以你应该这样做:

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

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

self.level += 1

您没有增加类属性。您正在创建一个新的实例属性。每当你有一个实例obj并且你obj,attr = ...创建了一个实例属性,而不是一个类属性。

您没有看到与 inven 相同的效果的原因是您可能正在对其进行变异(例如,使用self.inven.append(...))而不是重新绑定它。因此,您永远不会创建实例属性,而只是不断修改类属性。

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

于 2012-07-06T06:00:17.503 回答