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

如何对Python泛型类进行JSON序列化?

解决Python泛型类序列化的AttributeError问题

错误原因

这个错误是因为泛型类实例的__dict__在部分场景下是只读的mappingproxy对象,json.dumps的默认处理逻辑尝试访问它的__dict__属性,触发了报错。

可行解决方法

1. 改用vars()函数获取属性字典

vars()函数可以安全返回实例的属性字典,自动适配mappingproxy类型:

print(json.dumps(r, default=lambda o: vars(o)))

2. 手动将mappingproxy转为普通字典

通过遍历__dict__的键值对构造普通字典,避免直接访问引发的问题:

print(json.dumps(r, default=lambda o: dict(o.__dict__)))

3. 显式指定序列化字段

如果类的属性固定,直接构造包含目标字段的字典,更直观且性能更好:

print(json.dumps(r, default=lambda o: {"param": o.param}))

4. 给泛型类添加序列化方法

在类内部定义专门的序列化方法,让代码结构更清晰,适合频繁序列化的场景:

class MyGenericClass(Generic[T]):
    def __init__(self, param: T) -> None:
        super().__init__()
        self.param = param
    
    def to_json(self):
        return {"param": self.param}

# 序列化时调用该方法
print(json.dumps(r, default=lambda o: o.to_json()))

5. 使用dataclasses(推荐方案)

如果你的泛型类仅用于存储数据,dataclasses是更优选择,它原生支持泛型,且序列化逻辑更简洁:

from typing import TypeVar, Generic
import json
from dataclasses import dataclass, asdict

T = TypeVar('T')

@dataclass
class MyGenericClass(Generic[T]):
    param: T

r = MyGenericClass[str]('test')
# 两种序列化方式都可行
print(json.dumps(r.__dict__))
print(json.dumps(asdict(r)))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 18:50:19