我定義了以下三個類,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)用了一次。