You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Python Dataclass成员声明存入变量实现复用?

解决Dataclass成员声明复用的几种方案

方案一:拆分公共基类(最直观且符合Python习惯)

把重复出现的字段抽到父类中,子类按需继承即可,后续修改公共字段只需调整基类:

from dataclasses import dataclass
from typing import Union, Dict, List, Optional

@dataclass
class SaUnitBase(DataclassFromDict):
    _id: str = field_from_dict(default="")

@dataclass
class SaUnitWithCounters(SaUnitBase):
    counters: Union[Dict, List, None] = field_from_dict(default_factory=dict)

# 子类按需继承对应基类
@dataclass
class SaUnitBasic(SaUnitWithCounters):
    last_update: Union[Dict, List, None] = field_from_dict(default_factory=list)

@dataclass
class SaUnitUpdates(SaUnitWithCounters):
    pass

@dataclass
class SaUnitSensors(SaUnitBase):
    sensors: Union[Dict, List, None] = field_from_dict(default_factory=list)

方案二:单独存储字段的类型与默认值

如果不想调整继承结构,可以把字段的类型定义和默认值存为变量,在类中直接引用:

from dataclasses import dataclass
from typing import Union, Dict, List, Optional

# 定义可复用的字段配置
_ID_TYPE = str
_ID_DEFAULT = field_from_dict(default="")

COUNTERS_TYPE = Union[Dict, List, None]
COUNTERS_DEFAULT = field_from_dict(default_factory=dict)

@dataclass
class SaUnitBasic(DataclassFromDict):
    _id: _ID_TYPE = _ID_DEFAULT
    last_update: Union[Dict, List, None] = field_from_dict(default_factory=list)
    counters: COUNTERS_TYPE = COUNTERS_DEFAULT

@dataclass
class SaUnitUpdates(DataclassFromDict):
    _id: _ID_TYPE = _ID_DEFAULT
    counters: COUNTERS_TYPE = COUNTERS_DEFAULT

@dataclass
class SaUnitSensors(DataclassFromDict):
    _id: _ID_TYPE = _ID_DEFAULT
    sensors: Union[Dict, List, None] = field_from_dict(default_factory=list)

补充:动态生成类(适合极端动态场景)

如果需要更灵活的动态创建,可以用dataclasses.make_dataclass工具,但静态定义的方式可读性更强,更适合日常维护:

from dataclasses import make_dataclass

# 公共字段定义
common_fields = [
    ("_id", str, field_from_dict(default="")),
    ("counters", Union[Dict, List, None], field_from_dict(default_factory=dict))
]

SaUnitBasic = make_dataclass(
    "SaUnitBasic",
    common_fields + [("last_update", Union[Dict, List, None], field_from_dict(default_factory=list))],
    bases=(DataclassFromDict,)
)

内容的提问来源于stack exchange,提问作者Diaa Malek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 09:57:15