Python dataclasses_json:我可以存储对一个对象的许多引用吗?

时间:2018-10-02 13:34:52

标签: python json orm python-dataclasses

我想使用@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 =(

1 个答案:

答案 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