如何将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
相关产品推荐
相关产品推荐

