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
相关产品推荐
相关产品推荐

