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

2024-04-25 20:53:40 发布

您现在位置:Python中文网/ 问答频道 /正文

通过super().__init__()从子类调用__init__()对我们来说很方便,但是当我想从孙子类调用__init__()时应该怎么做呢?例如:

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

那么如何在C.__init__()内部调用A.__init__(),而不调用B.__init__()?显然,您可以在B.__init__()C.__init__()中包含super().__init__()。但是由于一些特殊的原因,我需要避免调用B.__init__()(即在C.__init__()内调用super().__init__()),那么我应该怎么做呢?你知道吗


Tags: selfbaseinitdef原因子类classsuper
2条回答

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

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

但是,跳过层次结构中的类的整个想法在将来肯定会引起问题。你知道吗

根据导致您希望这样做的原因,您可以:

  • init函数中添加一个参数,以控制从a的构造函数调用时类B中的行为
  • 使C成为a的子类,并将公共代码放在使用多重继承添加的单独类中。你知道吗
  • 将B的初始化代码放在一个单独的函数中,在C中重写该函数使其不起任何作用

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

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

和B类,实现了一个类:

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

相关问题 更多 >

    热门问题