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

如何限制dataclass序列化仅保留基类属性?

问题描述

以下是示例代码:

from dataclasses import dataclass
from dataclasses_json import dataclass_json

@dataclass_json
@dataclass
class Foo:
    f: str

@dataclass_json
@dataclass
class Baz(Foo):
    b: str

    def full(self):
        return self.to_dict()
        # 预期返回 {"f":"f", "b":"b"}


    def partial(self):
        return Foo.to_dict(self)
        # 实际仍返回 {"f":"f", "b":"b"}
        # 如何让它仅返回 {"f":"f"}?


print(Baz(f="f", b="b").partial())

输出:

{"f":"f", "b":"b"}

如何让partial方法仅返回f属性,而非同时返回b和f属性?


解决方法

方法1:手动提取父类字段构造字典

直接从实例中提取Foo类定义的字段,构造目标字典返回:

def partial(self):
    return {field.name: getattr(self, field.name) for field in Foo.__dataclass_fields__.values()}

方法2:转换为父类实例后调用to_dict

将Baz实例转换为Foo类型后再调用to_dict,dataclass_json会仅序列化父类字段:

def partial(self):
    return Foo(self.f).to_dict()

若父类字段较多,可借助dataclasses.asdict批量提取字段:

from dataclasses import asdict

def partial(self):
    foo_fields = {k: v for k, v in asdict(self).items() if k in Foo.__dataclass_fields__}
    return Foo(**foo_fields).to_dict()

方法3:利用dataclass_json的override参数

调用to_dict时通过override参数指定仅包含父类字段:

def partial(self):
    return self.to_dict(override=dict(include=list(Foo.__dataclass_fields__.keys())))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:30:35