python 建構函式的*_[Python] 繼承建構函式
阿新 • • 發佈:2021-02-14
技術標籤:python 建構函式的*
最普通的繼承
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
沒辦法被進一步呼叫了