python - 我想使用pickle存储一个具有另一个对象列表的对象
问题描述
我正在使用 Python 3.9,并尝试使用 pickle 存储对象。虽然,此对象包含一个对象列表,其中包含另一个对象列表。
如果我创建第一个对象,使用 pickle 存储它,然后删除它并检索它,而不停止程序,我有另一个对象的列表。
如果我停止程序然后尝试检索它,另一个对象的列表似乎是空的。
我制作的课程如下所示:
class First():
list_of_Second = []
info = 0
def __init__(self,...,):
...
class Second():
list_of_Third = []
info = 0
...
class Third():
info = 0
...
def get_First_class_from_file(filename):
with open(filename, 'rb') as f:
return pickle.load(f)
因此,当我尝试从文件中检索我的课程时,我得到一个空的list_of_Second
. 检索第一类中的所有其他信息。
编辑,感谢@juanpa.arrivillaga 部分解决:我使用的是类变量,所以它不起作用。如果我将列表放入构造函数中,我将使用一个实例变量,它将用于存储list_of_Second
. 虽然,list_of_Third
又是空的。代码如下所示:
class First():
info = 0
def __init__(self,...,):
list_of_Second = []
...
class Second():
info = 0
def __init__(self,...,):
list_of_Second = []
...
class Third():
info = 0
...
def get_First_class_from_file(filename):
with open(filename, 'rb') as f:
return pickle.load(f)
解决方案
我没有完整的代码,所以这里是完整的解释:
仅 Pickle 转储和加载实例,文档中对此进行了说明:https ://docs.python.org/3/library/pickle.html
同样,类是通过命名引用腌制的,因此在 unpickling 环境中适用相同的限制。请注意,没有任何类的代码或数据被腌制,因此在以下示例中,类属性 attr 不会在 unpickling 环境中恢复:
class Foo:
attr = 'A class attribute'
picklestring = pickle.dumps(Foo)
这些限制是为什么必须在模块的顶层定义可提取函数和类的原因。
但是类是它们的元类(通常是对象)的实例。
list_of_Second 是类属性,而不是实例属性。您必须如上所示序列化您的类才能检索类属性。
您需要在加载其实例之前加载该类。
推荐阅读
- python - 使用 tf.data.Dataset 的多分支网络
- python - python子进程git克隆
- c++ - 扑克问题 - 无法从“int”转换为“string”
- javascript - 从已使用 wavesurfer.js 修改的网络下载音频
- r - 如何在ggplot中将日期指定为x轴标签?尝试使用 geom_vline() R 匹配日期
- python - 如何保存通讯录中收集的数据?
- ios - NSUserDefaults 保存分数
- elasticsearch - Elasticsearch 查询具有多个条件的不同值
- javascript - 我想将输入数据存储在对象中但不能这样做?
- node.js - 猫鼬异步等待,无法捕获连接状态