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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 00:14:57