我有这堂课:
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__)):
但这也不起作用
答案 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