我想使用@dataclass_json
装饰器来存储我的@dataclass
实例。
我想在实例中有很多对一个对象的引用。而且我想保存此参考结构(以便我可以修改一个设置对象,并且所做的修改将应用于使用该设置的许多对象)。
当dataclass对象位于内存中时,可以很容易地做到这一点,但是当我尝试将其存储在JSON中时,它将保存实例的副本而不是其引用。我能以某种方式处理它吗?
P.S。这是我的代码示例:
from dataclasses import dataclass
from dataclasses_json import dataclass_json
from typing import List
@dataclass_json
@dataclass
class RadarSettings:
freq: float = 10e9
prf: float = 1e-3
@dataclass_json
@dataclass
class Radar:
name: str = ""
preset_settings: RadarSettings = None # Here should be references to some boilerplate preset settings for many radars
custom_settings: RadarSettings = None # And here should be the custom settings to this current radar
@dataclass_json
@dataclass
class RadarScene:
name: str = ""
radars: List["Radar"] = None
preset = RadarSettings()
radar1 = Radar(name="mega search mode radar from hell", preset_settings=preset)
radar2 = Radar(name="satanic sensor array radar", preset_settings=preset)
# The preset_settings is one same object for both radars! If I modify it, the modifications will be applied to both radars
print(id(radar1.preset_settings), id(radar2.preset_settings))
scene_to_save = RadarScene(name="Infernal scene", radars=[radar1, radar2])
loaded_scene = RadarScene.from_json(scene_to_save.to_json())
print(id(loaded_scene.radars[0]), id(loaded_scene.radars[1]))
# Alas! Here will be two instances of preset_settings saved. I need one =(
答案 0 :(得分:0)
您描述的问题是预期的行为。将数据保存为json
格式时,将获得纯文本数据的字符串表示形式。
您可以通过至少两种方法来解决此问题。
方法1。
加载RadarScene
数据,创建preset = RadarSettings()
,遍历Radar
中的所有RadarScene
,并更新preset_settings
属性:radar.preset_settings = preset
。该方法可以封装到RadarScene
类中,因此您可以在加载数据后立即调用它。
方法2。
从RadarSettingsDefault
继承的新 singleton 类RadarSettings
并修改Radar
类:preset_settings: RadarSettingsDefault = None
。