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

如何从dataclass父类实例创建子类实例?

解决方案

针对你提出的dataclass继承场景,要将父类实例的属性扁平化传入子类构造函数,有几种实用的实现方式:

方法1:使用dataclasses.asdict()解包

asdict()是dataclasses模块提供的工具函数,会将dataclass实例转换为字典,还能递归处理嵌套的dataclass对象,通用性更强:

from dataclasses import dataclass, asdict

@dataclass
class A:
    x: int = 0

@dataclass 
class B(A):
    y: int = 0

a = A(x=5)
# 解包asdict返回的字典,传入B的构造函数
b = B(**asdict(a), y=6)

方法2:直接使用实例的__dict__属性解包

对于简单的dataclass(无嵌套、未使用__slots__),可以直接取实例的__dict__属性,它存储了实例的所有字段和对应值:

from dataclasses import dataclass

@dataclass
class A:
    x: int = 0

@dataclass 
class B(A):
    y: int = 0

a = A(x=5)
b = B(**a.__dict__, y=6)

方法3:自定义flatten函数封装逻辑

如果需要统一的扁平化操作,可以封装一个flatten函数,内部复用上面的实现:

from dataclasses import dataclass, asdict

def flatten(obj):
    return asdict(obj)

@dataclass
class A:
    x: int = 0

@dataclass 
class B(A):
    y: int = 0

a = A(x=5)
b = B(**flatten(a), y=6)

注意事项

  • 如果你的dataclass使用了__slots__,__dict__属性可能不存在,此时优先使用asdict()。
  • asdict()会递归转换嵌套的dataclass实例为字典,而__dict__只会保留嵌套实例本身,根据你的实际场景选择即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:25:00