如何在python中初始化多个超类..
例如:
class A (B, C):
def __init__(self, param):
B.__init__(self)
C.__init__(self, param)
#
#
答案 0 :(得分:6)
您的原始代码有效。它非常清晰可读。呼叫签名是明确的,允许您使用A
或A(p)
实例化A(param=p)
。
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
没有,你必须修改所有
三个使用更模糊(但是
制服!)**kwargs
参数。因此,呼叫签名不再明确。
现在A
只能实例化
使用A(param=p)
,而不再是A(p)
与A
。
更糟糕的是(正如Sven Marnach指出的那样)
在评论中),传递给kwargs
的每个参数必须在object
处弹出,因为C
不接受任何参数。一次上课
(例如kwargs
)弹出一个参数
B
,没有其他类(例如
B
)可以使用相同的参数名称。因此,参数的命名需要在所有类之间进行一些协调,即使理想情况下,C
和super
应该彼此独立。
该代码有更多的锅炉板 和并发症。这不容易 读取。
因此,我通常更喜欢避开super
(与原始代码一样),除非{{1}}提供的间接超过上述费用。