【问题标题】:Python dataclasses_json: can I store many references to one object?Python dataclasses_json:我可以存储对一个对象的多个引用吗?
【发布时间】:2019-03-07 15:33:52
【问题描述】:

我想使用@dataclass_json 装饰器来存储我的@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 =(

【问题讨论】:

    标签: python json orm python-dataclasses


    【解决方案1】:

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

    您可以通过至少几种方法解决此问题。

    方法一。

    加载RadarScene 数据,创建preset = RadarSettings(),遍历RadarScene 中的所有Radars 并更新preset_settings 属性:radar.preset_settings = preset。该方法可以封装到RadarScene类中,加载数据后直接调用。

    方法二。

    创建新的singletonRadarSettingsDefault继承自RadarSettings并修改Radar类:preset_settings: RadarSettingsDefault = None

    【讨论】:

    • 问题是我可以有多个预设。例如,我可以有 5 个雷达。其中两个有预设 1,三个有预设 2...
    • @Felix 比 method_1 仍然可行 - 在 RadarScene 内迭代 Radars 并为 preset_settings 值的每个唯一组合创建新的 RadarSetting 对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多