-1

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

4

2 回答 2

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, {})
于 2013-03-12T06:15:05.853 回答
1

是的。为什么不?

以下是动态创建类对象的方法:

type('a',(object,),{})

这将创建一个类型为 - type 的类对象,它派生自对象基类,其属性是一个空字典。

因此,在您的情况下,呼叫将是:

type('Foo',args,{})

在这里, args 将包含您要从中继承 Foo 的所有基类。结果将是一个 clas 对象,您可以使用它从 mixins 返回。

于 2013-03-12T06:13:54.040 回答