初始化多个超类python

Jon*_*ira 1 python class

我怎么能初始化python中的倍数超类..

例如:

class A (B, C):
    def __init__(self, param):
        B.__init__(self)
        C.__init__(self, param)
    #
#
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 6

您的原始代码有效.它非常清晰可读.呼叫签名是明确的,并且允许你实例化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然而,使用需要相当沉重的代价:

  1. __init__所有类的呼叫签名必须相同.由于A并且 C有一个param参数但B 没有,你必须修改所有三个以使用更模糊(但统一!)的**kwargs参数.因此,呼叫签名不再明确.

  2. 现在A只能用A(param=p),而不再用实例化A(p).

  3. 更糟糕的是(正如Sven Marnach在评论中指出的那样),所有传递给的论点A必须在某些时候突然出现,kwargs因为object不接受任何论点.一旦类(例如C)弹出一个参数kwargs,其他类(例如 B)就不能使用相同的参数名.因此,参数的命名需要所有类之间的一些协调,即使理想情况下,BC应该彼此独立.

  4. 该代码具有更多的锅炉板和复杂性.它不太容易阅读.

因此,我通常更喜欢避开super(与原始代码一样),除非所提供的间接super费用超过上述费用.