Python多类继承动态创建类型时如何正确调用super()
动态创建多继承类时的super()调用问题
我需要通过协作继承动态创建一个继承自多个基类的type,现有代码能正确识别实例的类型(比如assert isinstance(dynamic_instance, SomeClass)返回True),但在构造函数中调用super().__init__(*args, **kwargs)时出现错误:
TypeError: super(type, obj): obj must be an instance or subtype of type
推测是self的上下文问题导致,子类基于协作继承设计,正确调用super()十分关键,求解决建议。
完整代码如下:
class SomeClass: def __init__(self, *args, **kwargs): super(*args, **kwargs) self.some_class = True class OtherClass: def __init__(self, *args, **kwargs): super(*args, **kwargs) self.other_class = True cls_map = {"SomeClass": SomeClass, "OtherClass": OtherClass} def get_type(classes: list[str]): def constructor(self, *args, **kwargs): super().__init__(*args, **kwargs) types: list[type] = [cls_map[c] for c in classes] return type("MutableEntity", tuple(types), { "__init__": constructor }) # Get type, instantiate object dynamic_cls: type = get_type(['SomeClass', 'OtherClass']) dynamic_instance = dynamic_cls() assert hasattr(dynamic_instance, 'some_class') assert hasattr(dynamic_instance, 'other_class')
问题分析与解决方法
1. 修复基类中的错误super调用
你的基类SomeClass和OtherClass中super(*args, **kwargs)的写法是错误的,super()本身不需要传递args参数,正确的协作继承调用方式应该是super().__init__(*args, **kwargs),这样才能正确触发MRO链中下一个类的构造函数。
2. 修复动态类构造函数的super上下文问题
嵌套在get_type中的constructor函数无法自动获取动态生成类的上下文,导致super()无法识别当前类。解决方法是显式指定当前类(通过self.__class__获取)来调用super:
修改后的完整代码:
class SomeClass: def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 修复此处的super调用 self.some_class = True class OtherClass: def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 修复此处的super调用 self.other_class = True cls_map = {"SomeClass": SomeClass, "OtherClass": OtherClass} def get_type(classes: list[str]): def constructor(self, *args, **kwargs): # 显式指定当前类和实例,让super能正确找到MRO链 super(self.__class__, self).__init__(*args, **kwargs) types: list[type] = [cls_map[c] for c in classes] return type("MutableEntity", tuple(types), { "__init__": constructor }) # 测试代码 dynamic_cls: type = get_type(['SomeClass', 'OtherClass']) dynamic_instance = dynamic_cls() assert hasattr(dynamic_instance, 'some_class') assert hasattr(dynamic_instance, 'other_class')
原理说明
self.__class__会返回当前实例所属的动态生成类MutableEntity,将其作为super的第一个参数,再传入self,就能让super正确识别MRO链,依次调用所有基类的__init__方法。- 修复后的基类
super调用,会沿着MRO链传递构造参数,保证协作继承的正确性。
内容的提问来源于stack exchange,提问作者CCD
相关产品推荐
相关产品推荐

