初始化多个超类python

时间:2011-06-09 14:20:49

标签: python class

如何在python中初始化多个超类..

例如:

class A (B, C):
    def __init__(self, param):
        B.__init__(self)
        C.__init__(self, param)
    #
#

1 个答案:

答案 0 :(得分:6)

您的原始代码有效。它非常清晰可读。呼叫签名是明确的,允许您使用AA(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

  1. 所有课程的__init__来电签名 必须是一样的。自A和。{ C有一个param参数但B 没有,你必须修改所有 三个使用更模糊(但是 制服!)**kwargs参数。因此,呼叫签名不再明确。

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

  3. 更糟糕的是(正如Sven Marnach指出的那样) 在评论中),传递给kwargs的每个参数必须在object处弹出,因为C不接受任何参数。一次上课 (例如kwargs)弹出一个参数 B,没有其他类(例如 B)可以使用相同的参数名称。因此,参数的命名需要在所有类之间进行一些协调,即使理想情况下,Csuper应该彼此独立。

  4. 该代码有更多的锅炉板 和并发症。这不容易 读取。

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