【问题标题】:I want to store an object that has a list of another object using pickle我想使用pickle存储一个具有另一个对象列表的对象
【发布时间】:2020-12-23 09:45:44
【问题描述】:

我正在使用 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)

【问题讨论】:

标签: python object pickle


【解决方案1】:

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

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

您需要先加载类,然后再加载其实例。

【讨论】:

  • 所以,你是说不可能用类列表序列化一个类,对吧?你知道有什么办法吗?
  • @n45os 不,我的意思是您正在尝试序列化 CLASS 属性而不是 INSTANCE 属性。如果你想序列化classe属性,你必须序列化classe,然后加载它的实例。如果您只尝试序列化实例,您将永远无法获得类属性。如文档所示,执行:pickle.dump(First, myfile) 序列化类
  • 但是如果我尝试序列化该类,我将无法获得我提供给实例的所有信息。
  • 请正确阅读给出的答案。 1. 反序列化 CLASS 2. 反序列化它的 INSTANCE
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 2016-12-12
相关资源
最近更新 更多