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

Python中如何通过解包传参初始化含成员类的对象?

解决方案

方法1:重写A类的__init__方法直接拆分参数

直接自定义A类的构造方法,接收6个参数,前3个赋值给A自身的成员,后3个用来初始化B类实例并赋值给self.b,完全匹配需求:

from dataclasses import dataclass

@dataclass
class Base():
    def __str__(self):
        data = ','.join([str(x) for x in vars(self).values()])
        return data

    def get_data(self):
        return ','.join([str(x) for x in vars(self).values()])

@dataclass
class B(Base):
    b1: int = 0
    b2: int = 0
    b3: int = 0

@dataclass
class A(Base):
    a1: int = 0
    a2: int = 0
    a3: int = 0
    b: B = None

    # 重写构造方法,处理6个参数
    def __init__(self, a1=0, a2=0, a3=0, b1=0, b2=0, b3=0):
        self.a1 = a1
        self.a2 = a2
        self.a3 = a3
        self.b = B(b1, b2, b3)

# 测试代码
num = [1,2,3,4,5,6]
my_data = A(*num)
print(my_data.get_data())  # 输出:1,2,3,B(b1=4, b2=5, b3=6)

方法2:优化get_data实现嵌套成员展开

如果希望get_data直接返回所有底层成员值(而非包含B类实例),可以修改Base类的get_data方法,递归遍历嵌套的Base子类实例:

@dataclass
class Base():
    def __str__(self):
        data = ','.join([str(x) for x in vars(self).values()])
        return data

    def get_data(self):
        def flatten(obj):
            result = []
            for val in vars(obj).values():
                if isinstance(val, Base):
                    result.extend(flatten(val))
                else:
                    result.append(str(val))
            return result
        return ','.join(flatten(self))

# 此时执行测试代码,get_data会输出:1,2,3,4,5,6

说明

  • 重写__init__后,dataclass的默认构造逻辑会被覆盖,需要手动处理参数默认值(比如示例中的=0),确保无参数初始化也能正常工作。
  • 使用vars(self)的方式确实能避免手动列举成员名,递归处理则可支持任意层级的Base子类嵌套。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 18:12:34