python cPickle不保存类列表

标签 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() 使其与之前不同

最佳答案

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/

相关文章:

c# - DataContract 序列化 - 基类、继承和覆盖

Python Pickle 与 Stringify

python - pickle 后日期时间戳是否更新?

python 列出鼠标点击坐标

python - 每个点使用一个带宽值的内核估计

java - hashCode() 值在执行之间发生变化

c# - 对象 xml 反序列化问题?

python - 是否可以在 SQLAlchemy 中卸载声明类?

python - 无法加载 pickle 的自定义估算器 sklearn 管道

python - Unpickling 失败,__new__() 恰好需要 1 个参数(给定 2 个)