在前面一節(jié)我們講了繼承的資源的重申,以及繼承資源的使用,現(xiàn)在我們接著講繼承資源的覆蓋以及資源的累加;
繼承資源的覆蓋:其實(shí)在講了繼承資源的使用,繼承資源的覆蓋就沒什么可講的了,資源的覆蓋就指的是父類有個資源,子類把父類的資源給覆蓋掉了,舉個例子:
下面這個代碼,我們A-B-C這樣的繼承關(guān)系,最頂層的父類C有一個text方法,然后我們在A類調(diào)用了這個方法,執(zhí)行的是B類的方法,這樣看起來其實(shí)就像是B的資源覆蓋了A的資源,也就做方法的重寫,雖然理解是這樣理解,但是其實(shí)本質(zhì)不是資源的覆蓋,這點(diǎn)大家也要清楚,本質(zhì)其實(shí)是C有C的資源,C的資源仍然沒變,B只是增加了一個text資源,只不過通過MRO訪問順序,就好像是資源的覆蓋;

然后這里有一個注意點(diǎn),就是我們通過A去訪問B的text方法,那個self到底是誰呢?到底是A呢,還是B呢,我們做一個測試:
通過下面的代碼測試我們知道通過誰去調(diào)用實(shí)例方法,或者類方法,那么就把誰傳到方法里面去;

資源的累加:指的就是在類的基礎(chǔ)之上,增加了一些額外的資源,這里分為兩種情況,一種情況是子類相對于父類增加了一些額外的資源,一種是在被覆蓋的方法基礎(chǔ)之上,增加了新的內(nèi)容;
對于第一種情況,子類相對于父類增加額外的資源,這個沒啥可說的,這個資源就是子類獨(dú)有的,就和普通的增加資源一樣;
第二種情況是在覆蓋的方法基礎(chǔ)之上,增加新的內(nèi)容:意思是父類的方法也要執(zhí)行,在父類的方法執(zhí)行的基礎(chǔ)之上,增加子類的執(zhí)行:比如我們給子類增加實(shí)例屬性:
下面這個代碼就是覆蓋了父類的方法,增加了新的內(nèi)容,但是父類的方法并未執(zhí)行,這樣的話也不叫做覆蓋的方法基礎(chǔ)之上了,現(xiàn)在我們來看看如果要解決這個問題,要怎么做;

方法一:用最死板的方法,就是把父類的方法的代碼考下來,當(dāng)然這不可取,就不演示了;
方法二:就是在執(zhí)行init方法的時候,我們?nèi)フ{(diào)用父類的init方法:
下面這個就是在調(diào)用子類的方法的時候,我們在方法里面再去調(diào)用父類的方法,由于方法需要傳一個實(shí)例,我們就把子類的實(shí)例傳進(jìn)去,這樣子類也擁有了這個屬性,也就在覆蓋父類方法的基礎(chǔ)上增加了新的內(nèi)容

但是這種方法也有它的問題,下面我們看看是啥問題:
我們看下面的繼承關(guān)系,是一種菱形繼承,使用的是用父類去調(diào)自己的方法,我們可以看到最頂層的父類D的init方法執(zhí)行了兩次,

方法三:使用super,super也是一個類,用于在高優(yōu)先級的類中,通過super()調(diào)用低優(yōu)先級類的方法;它只在新式類中有效,它的作用是沿著MRO鏈條,找到下一節(jié)點(diǎn),去調(diào)用對應(yīng)的方法;在python3.x版本之前super()需要接收兩個參數(shù),第二個參數(shù)是找這個參數(shù)的MRO順序,也是默認(rèn)傳到父類的參數(shù),第一個參數(shù)是找這個參數(shù)的下一個節(jié)點(diǎn);其實(shí)說白了super的作用就是找出MRO的下一節(jié)點(diǎn);
下面的代碼就是用super()調(diào)用,大家可以看到父類D的init方法并沒有執(zhí)行兩遍了,還有一點(diǎn)就是在python3.x版本,super不用手動給參數(shù),解釋器會根據(jù)上下文自動填參數(shù);

super()調(diào)用注意事項(xiàng):1.我們知道super()第一個參數(shù)是找這個參數(shù)的下一個節(jié)點(diǎn),其實(shí)就是自己類的下一個節(jié)點(diǎn),有的同志估計會寫成self.__class__,以為這樣可以動態(tài)加入,但是其實(shí)這樣是不可取的,因?yàn)槲覀兊膕elf可能是它的子類的實(shí)例,這樣的話就變成了子類,就會陷入死循環(huán):

2.使用super()最好不要和類去調(diào)用方法 混用,這樣容易混亂,造成數(shù)據(jù)的紊亂;這里就不舉例了;
總結(jié):至此,繼承就已經(jīng)結(jié)束了;繼承看著這么多東西,其實(shí)繼承主要就是對于資源繼承的分析。所有的東西都是圍繞資源進(jìn)行展開的,主要就是1.資源的繼承,2.資源的使用,3.資源的覆蓋,4.資源的累加;這幾個方面其實(shí)并不是單獨(dú)的,而是互相有關(guān)系的;只能說要多敲代碼,慢慢體會;