我怎么能初始化python中的倍数超类..
例如:
class A (B, C):
def __init__(self, param):
B.__init__(self)
C.__init__(self, param)
#
#
Run Code Online (Sandbox Code Playgroud)
您的原始代码有效.它非常清晰可读.呼叫签名是明确的,并且允许你实例化A与任一A(p)或A(param=p).
class A(B, C):
def __init__(self, param):
B.__init__(self)
C.__init__(self, param)
Run Code Online (Sandbox Code Playgroud)
它也可以使用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
Run Code Online (Sandbox Code Playgroud)
super然而,使用需要相当沉重的代价:
__init__所有类的呼叫签名必须相同.由于A并且
C有一个param参数但B
没有,你必须修改所有三个以使用更模糊(但统一!)的**kwargs参数.因此,呼叫签名不再明确.
现在A只能用A(param=p),而不再用实例化A(p).
更糟糕的是(正如Sven Marnach在评论中指出的那样),所有传递给的论点A必须在某些时候突然出现,kwargs因为object不接受任何论点.一旦类(例如C)弹出一个参数kwargs,其他类(例如
B)就不能使用相同的参数名.因此,参数的命名需要所有类之间的一些协调,即使理想情况下,B也C应该彼此独立.
该代码具有更多的锅炉板和复杂性.它不太容易阅读.
因此,我通常更喜欢避开super(与原始代码一样),除非所提供的间接super费用超过上述费用.