如何调用super()。super()?

时间:2019-10-11 20:22:46

标签: python python-3.x

我们很方便通过__init__()从子类中调用super().__init__(),但是当我想从孙子中调用__init__()时该怎么办?例如:

class A(Base):
     def __init__(self):
         ...
class B(A):
     def __init__(self):
         ...
class C(B):
     def __init__(self):
        ...

那么如何在A.__init__()内{strong>不呼叫C.__init__()内呼叫B.__init__()呢?显然,您可以在super().__init__()B.__init__()中都包含C.__init__()。但是由于某些特殊原因,我需要避免调用B.__init__()(即在super().__init__()内部调用C.__init__()),那我该怎么办?

2 个答案:

答案 0 :(得分:1)

您可以直接调用上层类的 init 函数:

class C(B):
     def __init__(self):
        A.__init__(self)
        ...

但是,跳过层次结构中的类的整个想法必然会在将来引起问题。

根据导致您想要此原因的原因,您可以:

  • 在您的 init 函数中添加一个参数,以控制从A的构造函数调用时B类中的行为。
  • 将C设为A的子类,并将通用代码放在使用多重继承添加的单独的类中。
  • 将B的初始化代码放在一个单独的函数中,您可以在C中重写该函数以使其不执行任何操作

答案 1 :(得分:1)

非常简单。您只需要在A.__init__(self)类构造函数中调用C。 例如,假设A类是:

class A():
    def __init__(self):
        print('a')

和B类一起,实现A类:

class B(A):
    def __init__(self):
        super().__init__()
        print('b')

然后您可以像这样实现C类:

class C(B):
    def __init__(self):
        A.__init__(self)
        print('c')

所以输出将是:

In[1]: obj1 = A()

a

In[2]: obj2 = B()

a
b

In[3]: obj3 = C()

a
c