如何动态构建具有另一个类的基础的类而不知道它们?

时间:2014-05-18 07:56:20

标签: python python-2.7

我有这堂课:

class C(A,B):
    ....
    ....
    ....

我想建立一个带有基数A,B的新类,但我实际上并不知道C有哪些基数或有多少基数。

我尝试过:class D(C.__bases__):

但我收到错误:

TypeError: Error when calling the metaclass bases
list() takes at most 1 argument (3 given)

现在,如果我这样做:class D(C.__bases__[0],C.__bases__[1]),它可行,但我需要知道这个,而不知道有多少基地。

尝试:

D(','.joing(C.__bases__)):

但这也不起作用

1 个答案:

答案 0 :(得分:3)

要创建具有动态基础集的类,您必须使用type()

def methodname1(self):
    pass

D = type('D', C.__bases__, {
    'attribute': 42,
    'methodname1': methodname1
})

type()获取类名,基数序列和类属性字典。这些包括所有功能。

以上示例相当于:

class D(A, B):
    attribute = 42

    def methodname1(self):
        pass

如果C有元类,您可以使用它;如果您不确定C是否具有元类型,请使用:

D = type(C)('D', C.__bases__, {
    'attribute': 42,
    'methodname1': methodname1
})

Python 3使这更容易;在那里,参数序列被视为函数调用,包括对***扩展的支持:

class D_in_python_3(*C.__bases__, metaclass=type(C)):
    pass