我想创建一个从可变数量的所谓mixin类创建一个新类的函数。我的第一直觉是使用*args
...
>>> def mixins(*args):
class Foo(*args):
SyntaxError: invalid syntax
...但是没有走得太远......既然那样不起作用,我试过这个,这似乎有用:
>>> def mixins(*args):
class Foo(args[0]):
pass
for arg in args[1:]:
class Foo(Foo, arg):
pass
return Foo
还有其他方法可以解决这个问题吗?
我创建了一个抽象基类,它有很多抽象方法。我有几种类型的子类,每种类都实现了一些所需的抽象方法,但不是全部。有时我可以通过混合2个子类来创建一个工作实例,有时需要更多来实现所有抽象方法。
答案 0 :(得分:2)
您可以使用type功能执行此操作:
def mixins(*args):
return type('Foo', args, {})
您可能还希望确保该类始终从object
继承:
def mixins(*args):
bases = args if object in args else args + (object,)
return type('Foo', bases, {})
答案 1 :(得分:1)
是。为什么不呢?
以下是如何动态创建类对象:
type('a',(object,),{})
这将创建一个类型为-type的类对象,该对象派生自对象基类,其属性为空字典。
因此,在您的情况下,呼叫将是:
type('Foo',args,{})
这里,args将包含您要从中继承Foo的所有基类。结果将是一个clas对象,您可以使用它从mixins返回。