假设我有这样的类层次结构:
class SerializableWidget(object):
# some code
class WidgetA(SerilizableWidget):
# some code
class WidgetB(SerilizableWidget):
# some code
我希望能够将WidgetA
和WidgetB
(以及其他可能的小部件)的示例序列化为json
形式的文本文件,然后,我希望能够反序列化这些示例,而无需事先知道它们的特定类:
some_widget = deserielize_from_file(file_path) # pseudocode, doesn't have to be exactly a method like this
而some_widget
需要从SerilizableWidget
的精确子类中构造出来,我该怎么做呢?在层次结构的每个类中,我到底需要覆盖/实现哪些方法呢?
假设上述类的所有字段都是基元类型,那么如何覆盖__to_json__
和__from_json__
方法呢?
2条答案
按热度按时间3wabscal1#
您可以使用许多方法来解决这个问题。例如,将
object_hook
和default
参数分别用于json.load
和json.dump
。您所需要的只是将类与对象的序列化版本存储在一起,然后在加载时必须使用哪个类与哪个名称的Map。
下面的例子使用
dispatcher
类装饰器来存储序列化时的类名和对象,并在以后反序列化时查找它。您所需要的只是每个类上的_as_dict
方法来将数据转换为dict:现在进行测试。首先让我们创建一个包含3个不同类型对象的列表。
序列化它将在每个对象中生成具有类名的数据:
然后将其加载回生成正确的对象:
最后,下面是
dispatcher
的实现:amrnrhlw2#
我真的很喜欢@nosklo的answer,但是我想自定义模型类型保存的属性值,所以我稍微扩展了他的代码,添加了一个子注解。
(我知道这与问题没有直接关系,但是你也可以用它来序列化到json,因为它会产生dict对象。注意你的基类必须使用
@dataclass
注解来正确序列化--否则你可以调整这段代码来定义__as_dict__
方法,就像@nosklo的答案一样)data.csv
:test.py
:polymorphic.py
:Sample console output
: