1. 程式人生 > 其它 >python 建構函式的*_[Python] 繼承建構函式

python 建構函式的*_[Python] 繼承建構函式

技術標籤:python 建構函式的*

4f5762dc551d1b665d79ecd375393610.png

最普通的繼承

class Father():
    def __init__(self):
        print('Father')

class Son(Father):
    def __init__(self):
        print('Son')
        super().__init__()

son = Son()

兒子實現了自己的建構函式_init_()的同時繼承了爹的建構函式

例項化一個兒子的時候,在兒子的建構函式內,先執行自身的print,再執行爹的建構函式,所以——

Son
Father

當然了也可以反一反

class Son(Father):
    def __init__(self):
        super().__init__()
        print('Son')

這樣子就是父慈子孝了(霧

開始套娃

現在我有這樣三個類

class GrandFather:
...
class Father(GrandFather):
...
class Son(Father):
...

出於某些原因,我希望在Son中去呼叫GrandFather的建構函式,而Father沒有建構函式,換言之,架空爹,直接向太上皇彙報(有這樣的兒子肯定往死裡打……

實際上, super().__init__()

是縮寫

真實的完整的寫法是 super(Son, self).__init__()

含義是呼叫Son的父類

所以如果我們把Son替換為Father,是否就可以呼叫Father 的父類,也就是GrandFather的構造函數了呢?

是的,可以

class GrandFather:
    def __init__(self):
        print('GrandFather')

class Father(GrandFather):
    def __init__(self):
        print('Father')

class Son(Father):
    def __init__(self):
        print('Son')
        super(Son, self).__init__()
        print('準備繞過爹')
        super(Father, self).__init__()

son = Son()

如上的示例中,Son先呼叫了Father的建構函式,但Father並沒有直接呼叫GrandFather的建構函式,而是被Son跳過了Father直接呼叫

Son
Father
準備繞過爹
GrandFather

我的某個程式中,有一個通用的抽象作為GrandFather,大部分模組都只到Father這一層,但又有少部分模組有一些共性,但是細節上不同,所以又派生出了Son這一層,於是我就找如何跳過Father這一層去呼叫GrandFather的建構函式

這些少部分的模組,Father的建構函式程式碼處理一些通用的資料邏輯,所以也就沒有呼叫GrandFather的建構函式

嗯,大概率幾個月後我就看不懂我寫了啥了(大霧

一個小坑

在這個情況下,Father切記不能寫成__Father

否則就會變成這樣

Son
Father
準備繞過爹
Traceback (most recent call last):
  File "d:/OneDrive/1_python_project/py_learn/class3.py", line 16, in <module>
    son = Son()
  File "d:/OneDrive/1_python_project/py_learn/class3.py", line 14, in __init__
    super(__Father, self).__init__()
NameError: name '_Son__Father' is not defined

看起來__Father沒辦法被進一步呼叫了