如何在不知道另一个类的基的情况下动态地构建类



我有这样一个类:

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

我想用基础a,B建立一个新的类,但我实际上不知道C有哪些基础或有多少。

Ive tried: 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__)):

但是这行不通

要创建一个具有动态基集的类,您必须使用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

最新更新