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()使它与之前不同
答案 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中的工作原理。