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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:06:02