首页 > 解决方案 > 我想使用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)

标签: pythonobjectpickle

解决方案


我没有完整的代码,所以这里是完整的解释:

仅 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 是类属性,而不是实例属性。您必须如上所示序列化您的类才能检索类属性。

您需要在加载其实例之前加载该类。


推荐阅读