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)
解决方案
原代码问题分析
- 错误创建新的父类实例并调用
__init__,没有作用在当前子类实例上 - 直接将实例解包为
**kwargs,但实例不是字典,无法直接传递 elif后缺少判断条件,存在语法错误- 定义的
__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
相关产品推荐
相关产品推荐

