如何从JSON创建Python类实例 解决namedtuple无法修改字段问题
从JSON生成可变Python类实例的实现方案
以下是几种可落地的实现方案,完全满足属性可修改、可直接从JSON数据初始化的需求:
方案1:手动适配自定义类(无额外依赖)
针对你给出的Settings类,新增类方法做JSON字典映射即可,逻辑完全可控:
import json class Settings: item1: int item2: list def __init__(self, item1=0, item2=None): self.item1 = item1 # 规避Python可变默认参数共用的坑 self.item2 = item2 if item2 is not None else [] @classmethod def from_dict(cls, data: dict): return cls(**data) # 调用示例 if __name__ == "__main__": # 模拟JSON加载得到的字典 json_str = '{"item1": 10, "item2": ["a", "b"]}' json_data = json.loads(json_str) settings = Settings.from_dict(json_data) # 验证属性可修改 settings.item1 = 20 settings.item2.append("c") print(settings.item1, settings.item2) # 输出 20 ['a', 'b', 'c']
方案2:用dataclasses简化实现(Python 3.7+内置)
不需要手写初始化逻辑,代码更简洁,原生支持可变属性:
from dataclasses import dataclass, field import json from typing import List @dataclass class Settings: item1: int = 0 item2: List = field(default_factory=list) @classmethod def from_dict(cls, data: dict): return cls(**data) # 调用方式和方案1完全一致 json_data = json.loads('{"item1": 10, "item2": ["a", "b"]}') settings = Settings.from_dict(json_data) # 属性可正常修改 settings.item1 = 30
方案3:适配嵌套JSON结构
如果你的JSON存在多层嵌套,可以配合轻量序列化库实现自动映射,不需要手写每一层的解析逻辑:
from dataclasses import dataclass, field from dataclass_wizard import fromdict from typing import List @dataclass class SubSettings: opt: str = "default" @dataclass class Settings: item1: int = 0 item2: List = field(default_factory=list) sub: SubSettings = field(default_factory=SubSettings) # 直接从嵌套字典生成实例 json_data = {"item1": 10, "item2": ["a"], "sub": {"opt": "custom"}} settings = fromdict(Settings, json_data) print(settings.sub.opt) # 输出 custom settings.sub.opt = "new" # 嵌套属性也可正常修改
内容的提问来源于stack exchange,提问作者AliReza Beigy
相关产品推荐
相关产品推荐

