在 Python 中使用多类继承动态创建类型时调用 Super

问题描述 投票:0回答:1

如何通过协作继承动态创建一个从多个基类继承的

type
?我尝试了几个选项,每个选项都有自己的问题。我当前的代码是这样工作的:

    cls_map = {"SomeClass" : SomeClass, "OtherClass" : OtherClass}


    def get_type(classes: list[str]):

        def constructor(self, *args, **kwargs):
            pass

        types: list[type] = [cls.cls_map[c] for c in classes]
   
        return type("MutableEntity", tuple(types), {
            "__init__": constructor
        })
        
    # Get type, instantiate object
    dynamic_cls: type = cls._get_type(['SomeClass', 'OtherClass'])
    dynamic_instance = dynamic_cls(...)

当我执行

assert isinstance(dynamic_instance, SomeClass)

它返回

True
(太棒了!)。

我遇到的问题是我不知道如何使

constructor
正确调用
super().__init__(*args, **kwargs)
.

我试过:

 def constructor(self, *args, **kwargs):
            pass

但是出现如下错误:

E       TypeError: super(type, obj): obj must be an instance or subtype of type

我的理论是,这是因为论证

self
出于某种原因是
None
。任何建议如何解决这个问题?我的子类设计为使用协作继承来运行,因此能够调用
super()
很重要。

完整代码:

    class SomeClass:
        def __init__(self, *args, **kwargs):
            self.some_class = True

    class OtherClass:
        def __init__(self, *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.cls_map[c] for c in classes]
   
        return type("MutableEntity", tuple(types), {
            "__init__": constructor
        })
        
    # Get type, instantiate object
    dynamic_cls: type = cls.get_type(['SomeClass', 'OtherClass'])
    dynamic_instance = dynamic_cls()

    assert hasattr(dynamic_instance, 'some_class')
    assert hasattr(dynamic_instance, 'other_class')

python python-3.x dynamic multiple-inheritance
1个回答
0
投票

你需要这样的东西:

def constructor(self, *args, **kwargs):
    super(klass, self).__init__(*args, **kwargs)

klass = type(
    "MutableEntity", 
     tuple(types), 
     {"__init__": constructor}
)

return klass 
© www.soinside.com 2019 - 2024. All rights reserved.