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

