工厂函数用于创建具有未知数量的mixin的类

时间:2013-03-12 05:59:30

标签: python factory mixins

我想创建一个从可变数量的所谓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个子类来创建一个工作实例,有时需要更多来实现所有抽象方法。

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返回。

相关问题