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

Python dataclasses_json:我可以存储对一个对象的多个引用吗?,python,json,orm,python-dataclasses,Python,Json,Orm,Python Dataclasses,我想使用@dataclass\ujson装饰器来存储我的@dataclass实例 我想在实例中对一个对象有很多引用。我想保存这个引用结构(这样我可以修改一个设置对象,并且修改将应用于使用设置的多个对象) 当dataclass对象位于内存中时,这很容易完成,但当我尝试将其存储在JSON中时,它会保存实例的副本而不是引用。我能设法应付吗 另外,下面是我的代码示例: from dataclasses import dataclass from dataclasses_json import datac

我想使用
@dataclass\ujson
装饰器来存储我的
@dataclass
实例

我想在实例中对一个对象有很多引用。我想保存这个引用结构(这样我可以修改一个设置对象,并且修改将应用于使用设置的多个对象)

当dataclass对象位于内存中时,这很容易完成,但当我尝试将其存储在JSON中时,它会保存实例的副本而不是引用。我能设法应付吗

另外,下面是我的代码示例:

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 =(

您描述的问题是预期行为。当您将数据保存为
json
格式时,您会得到纯文本数据的字符串表示形式

您可以使用至少两种方法解决此问题

方法1

加载
RadarScene
数据,创建
preset=RadarSettings()
,迭代
RadarScene
中的所有
Radar
并更新
preset\u设置
属性:
Radar.preset\u设置=preset
。此方法可以封装到
RadarScene
类中,以便您可以在加载数据后立即调用它

方法2


创建新的singleton
RadarSettingsDefault
继承自
RadarSettings
并修改
Radar
类:
preset\u设置:RadarSettingsDefault=None

问题是我可以有多个预设。例如,我可以有5部雷达。其中两个具有预设1,三个具有预设2…@Felix Than方法1仍然可行-在
RadarScene
内迭代
RadarScene
并为
preset\u设置值的每个唯一组合创建新的
RadarSetting
对象。