python多繼承

我定義了以下三個類,Mother,F(xiàn)ather,Son,Son繼承了Mother,F(xiàn)ather兩個類

class Mother(): 
     name = 'hanmeimei' 
class Father():
    name = 'lilei'
class Son(Mother,Father):
    pass

然后創(chuàng)建Son的實例s

s = Son()
print(s.name)

輸出結(jié)果為:

hanmeimei

當(dāng)我給Father類添加init():

class Father():
 # 添加的代碼
 def __init__(self):
     self.name = 'liming'

輸出結(jié)果為:

# 這里跟我設(shè)想的不一樣,我原以為還是會打印hanmeimei
liming

自己嘗試分析原因:
1.首先了解init()方法:它會在我們創(chuàng)建空對象之后調(diào)用,完成對空對象的初始化。

2.python中每個類都繼承自O(shè)bject類

3.在第一次運行中,我所寫的三個類都沒有顯示調(diào)用init()方法,但是并意味著init()方法沒有調(diào)用,而是系統(tǒng)會隱式調(diào)用init()方法完成對象的初始化。這個隱式調(diào)用的init()方法其實是藏在超類Object里面。即Object類有一個init()函數(shù)。

4.修改了Father類,給Father類添加了init()函數(shù)之后,結(jié)果打印的結(jié)果變成了liming,我的理解是涉及到類的繼承:

  • Son繼承了Mother和Father兩個父類,兩個父類都有name的屬性,那么Son的name屬性繼承于哪個父類是有規(guī)律的,python中的繼承遵循‘從左至右,廣度優(yōu)先’的原則,定義的時候
class Son(Mother,Father):

Mother在前,那么就會先在Mother類中尋找是否有name屬性。那么應(yīng)該可以解釋為什么打印的是‘ liming’了,因為Son本類中沒有init()函數(shù),所以會去父類中找,但是Mother類也沒有,根據(jù)廣度優(yōu)先,就會找Father類,而不是去Object類尋找。

然后我又給Mother類添加了init():

class Mother():
    def __init__(self):
        self.name = 'hanmeimei'
        print('mother')

執(zhí)行結(jié)果果然是hanmeimei:

mother
hanmeimei

然后我又給Son類添加了init():

class Son(Mother,Father):
    def __init__(self):
        self.name = 'xiaoming'
        print('son')

然后執(zhí)行結(jié)果為:

xiaoming
son

從執(zhí)行結(jié)果可以看出,init()方法只被調(diào)用了一次。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容