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

Python中如何从指定父类实例实例化多父类子类

问题:基于两个父类实例初始化子类

我需要实现一个继承自两个父类的子类,要求根据传入的父类实例(要么是A父类实例,要么是B父类实例)来初始化子类,让子类拥有对应父类的所有属性,同时加上自己的id属性。

现有父类定义:

class ASuperClass:
    def __init__(self, tediously, many, attributes):
        # 示例:赋值属性
        self.tediously = tediously
        self.many = many
        self.attributes = attributes

class BSuperClass:
    def __init__(self, tediously, many, attributes):
        self.tediously = tediously
        self.many = many
        self.attributes = attributes

我尝试了以下代码,但没能成功运行:

class SubClass(ASuperClass, BSuperClass):
    def __init__(self, id, a_super_class_instance, b_super_class_instance):
        self.id = id
        if a_super_class_instance:
           ASuperClass().__init__(**a_super_class_instance)
        elif:
           ASuperClass().__init__(**b_super_class_instance)
        else: 
           raise ValueError("At least one of the superclasses have to be passed.")

我的期望用法是:

# 先创建父类实例
a_inst = ASuperClass(...)
b_inst = BSuperClass(...)

# 传入对应父类实例初始化子类
s1 = SubClass(id, a_inst)
s2 = SubClass(id, b_inst)

解决方案

原代码问题分析

  1. 错误创建新的父类实例并调用__init__,没有作用在当前子类实例上
  2. 直接将实例解包为**kwargs,但实例不是字典,无法直接传递
  3. elif后缺少判断条件,存在语法错误
  4. 定义的__init__参数和期望的调用方式不匹配

正确实现代码

class ASuperClass:
    def __init__(self, tediously, many, attributes):
        self.tediously = tediously
        self.many = many
        self.attributes = attributes

class BSuperClass:
    def __init__(self, tediously, many, attributes):
        self.tediously = tediously
        self.many = many
        self.attributes = attributes

class SubClass(ASuperClass, BSuperClass):
    def __init__(self, id, parent_instance):
        self.id = id
        # 判断传入实例类型,提取属性并调用对应父类初始化方法
        if isinstance(parent_instance, ASuperClass):
            # 过滤特殊属性,仅提取用户定义的属性
            parent_attrs = {k: v for k, v in vars(parent_instance).items() if not k.startswith('__')}
            ASuperClass.__init__(self, **parent_attrs)
        elif isinstance(parent_instance, BSuperClass):
            parent_attrs = {k: v for k, v in vars(parent_instance).items() if not k.startswith('__')}
            BSuperClass.__init__(self, **parent_attrs)
        else:
            raise ValueError("必须传入ASuperClass或BSuperClass的实例")

使用示例

# 创建父类实例
a_inst = ASuperClass("test_tediously", "test_many", "test_attributes")
b_inst = BSuperClass("b_tediously", "b_many", "b_attributes")

# 初始化子类
s1 = SubClass(1, a_inst)
s2 = SubClass(2, b_inst)

# 验证属性
print(s1.id, s1.tediously)  # 输出: 1 test_tediously
print(s2.id, s2.attributes) # 输出: 2 b_attributes

补充说明

  • 如果父类__init__参数和实例属性不完全对应,可手动指定要传递的参数,比如parent_attrs = {"tediously": parent_instance.tediously, ...}
  • 由于显式调用对应父类的__init__,无需担心多继承的MRO(方法解析顺序)问题
  • 若需支持同时传入两个父类实例(合并属性),可修改逻辑依次调用两个父类的__init__,后续属性会覆盖前面的

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:57:30