如何通过协作继承动态创建一个从多个基类继承的
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')
你需要这样的东西:
def constructor(self, *args, **kwargs):
super(klass, self).__init__(*args, **kwargs)
klass = type(
"MutableEntity",
tuple(types),
{"__init__": constructor}
)
return klass