簡體   English   中英

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

[英]How to call super().super()?

我們通過super().__init__() __init__()很方便,但是當我想從孫子調用__init__()時該怎么辦? 例如:

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

那么如何在調用B.__init__() () 的情況下調用C.__init__() A.__init__()內部的 A.__init__() 呢? 顯然,您可以在B.__init__()C.__init__()中包含super().__init__() __() 。 但是由於某些特殊原因,我需要避免調用B.__init__() (即在C.__init__() super().__init__() () ),那我該怎么辦?

你可以直接調用上層的init function:

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

但是,在層次結構中跳過 class 的整個想法必然會在未來引起問題。

根據導致您想要這個的原因,您可以:

  • 當從 A 的構造函數調用時,將參數添加到您的init function 以控制 class B 中的行為。
  • 使 C 成為 A 的子類,並將公共代碼放在您使用多個 inheritance 添加的單獨 class 中。
  • 將 B 的初始化代碼放在一個單獨的 function 中,您在 C 中覆蓋它以使其不執行任何操作

就是這么簡單。 您只需要在C class 構造函數中調用A.__init__(self)即可。 例如,假設 A class 是:

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

和 B class,實現 A class:

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

然后你可以像這樣實現 C class :

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM