Skip to main content
 首页 » 编程设计

python之初始化多个父类(super class)python

2025年05月04日18sky-heaven

我如何在 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 :

  1. 所有类的__init__调用签名 必须相同。由于 A 和 C 有一个 param 参数但是 B 没有,你必须修改所有 三使用更模糊的(但 uniform!) **kwargs 参数。因此,调用签名不再是显式的。

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

  3. 甚至更糟(正如 Sven Marnach 指出的那样 out in the comments),传递给 A 的每个参数都必须在某个时候从 kwargs 中弹出,因为 object 不接受任何参数。一节课 (例如 C) 弹出一个参数 kwargs,没有其他类(例如 B) 可以使用相同的参数名称。因此参数的命名需要所有类之间的一些协调,即使在理想情况下,B 和 C 应该相互独立。

  4. 代码有更多的样板废料 和并发症。这不太容易 阅读。

因此,我通常更喜欢避免使用 super(就像您的原始代码一样),除非 super 提供的间接性超过了上述成本。