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() 使其与之前不同
最佳答案
inven
是类的属性,而不是实例的属性。 Pickle 不保存关于类的任何信息;它只是存储类的名称以便稍后重新实例化它。我猜你无论如何都不希望 inven 成为类属性,所以你应该这样做:
class player:
def __init__(self):
self.level = 1
self.exp = 0
self.inven = []
编辑:如果您看到 level
已保存,可能是因为您正在重新绑定(bind)它。例如,如果您有执行此操作的代码:
self.level += 1
您没有增加类属性。您正在创建一个新的实例属性。每当你有一个实例 obj
并执行 obj,attr = ...
时,你就创建了一个实例属性,而不是类属性。
您没有看到与 inven 相同的效果的原因是您可能正在改变它(例如,使用 self.inven.append(...)
)而不是重新绑定(bind)它。因此,您永远不会创建实例属性,只需不断修改类属性。
您应该在 StackOverflow 上搜索有关类与实例属性(有时也称为类和实例变量)的问题,以了解其在 Python 中的工作原理。
关于python cPickle不保存类列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11356604/