我如何在 python 中初始化多个父类(super class)..
例如:
class A (B, C):
def __init__(self, param):
B.__init__(self)
C.__init__(self, param)
#
#
请您参考如下方法:
您的原始代码有效。它非常清晰易读。调用签名很清楚,并允许您使用 A(p) 或 A(param=p) 实例化 A。
class A(B, C):
def __init__(self, param):
B.__init__(self)
C.__init__(self, param)
也可以使用super。它提供了吸引人的能力来取代 两次显式调用 B.__init__ 和 C.__init__ 一次调用 super(A,self).__init__:
class B(object):
def __init__(self, **kwargs):
print('B')
super(B,self).__init__(**kwargs)
class C(object):
def __init__(self, **kwargs):
print('C')
self.param=kwargs.pop('param',None)
super(C,self).__init__(**kwargs)
class A(B, C):
def __init__(self, **kwargs):
print('A')
super(A,self).__init__(**kwargs)
a=A(param=1)
# A
# B
# C
然而,使用 super 需要 rather heavy price :
所有类的
__init__调用签名 必须相同。由于A和C有一个param参数但是B没有,你必须修改所有 三使用更模糊的(但 uniform!)**kwargs参数。因此,调用签名不再是显式的。现在
A只能被实例化 使用A(param=p),不再 用A(p)。甚至更糟(正如 Sven Marnach 指出的那样 out in the comments),传递给
A的每个参数都必须在某个时候从kwargs中弹出,因为object不接受任何参数。一节课 (例如C) 弹出一个参数kwargs,没有其他类(例如B) 可以使用相同的参数名称。因此参数的命名需要所有类之间的一些协调,即使在理想情况下,B和C应该相互独立。代码有更多的样板废料 和并发症。这不太容易 阅读。
因此,我通常更喜欢避免使用 super(就像您的原始代码一样),除非 super 提供的间接性超过了上述成本。
