天天看點

python 面向對象 super_好好了解 Python 面向對象中的多繼承和super

最近有些朋友咨詢 VIP 相關的事,我說就是在介紹文裡面寫的那些,分階段進行的,知識就是那麼些知識,沒什麼牛逼,隻是我稍微能夠講得更容易了解一些罷了。

然後就有人問了,有沒有試看?

我說了句“沒有”之後,雙方都略顯尴尬,畢竟别的專欄都有好幾篇試看文章,我倒好,篇篇都加密...

是以今天就放一篇 VIP 裡面的基礎内容吧,目前基礎階段即将完結,就當做試看好了,以後有機會的話就讓每個階段都放一篇試看出來吧,滿足部分朋友的好奇心。

ok,以下是 VIP 基礎階段的試看文:

Python快速入門 | 好好了解 Python 面向對象中的多繼承和super

咱們上一篇講到了繼承,說到了子類和父類之間的關系,父類也叫作基類、超類,也就是 super class ,上次我們說要在子類使用父類定義的東西,就需要用到 super 方法,有些朋友不太了解:不是說子類繼承了父類,就直接都擁有了父類的東西了麼?為啥要使用 super 呢?

其實,如果你對 類 和 對象 (也就是我們上上篇說的内容)之間的差別有一個明确的認識,你會明白:“類隻是一個結構”,對嗎?是以你在定義結構的時候,它并不是執行個體化出來的對象了,你隻是定義,那麼你在定義方法的時候想要用到 super 類的方法,你就隻能用 super 來調用它。

python 面向對象 super_好好了解 Python 面向對象中的多繼承和super
python 面向對象 super_好好了解 Python 面向對象中的多繼承和super

當然,你也可以直接使用 super 類的名稱進行調用,比如這樣:

python 面向對象 super_好好了解 Python 面向對象中的多繼承和super

雖然可以直接使用父類的名稱來調用父類的方法,但是這隻是适用于單繼承的情況(小帥b之前給你舉的例子,黃種人繼承了人類,就是一個單繼承。)

接下來給你講的多繼承,相信你會對 super 更近一步的認識。

來舉一個多繼承的例子:

python 面向對象 super_好好了解 Python 面向對象中的多繼承和super

這裡的 super 類是 Person ,衍生出了黃種人的爸爸這個類和白種人媽媽這個類,而兒子又繼承了它們,用代碼展現一下就是這樣:

python 面向對象 super_好好了解 Python 面向對象中的多繼承和super

可以看到,YellowPeopleFather(Person) 和 WhitePersonMother(Person) 是我們之前熟悉的單繼承,而 class Son(YellowPeopleFather, WhitePersonMother) 同時繼承了 YellowPeopleFather 和 WhitePersonMother ,是以這就是多繼承,最大的好處就是當我們執行個體化出 Son 對象的時候,可以同時擁有 YellowPeopleFather 和 WhitePersonMother 的東西:

python 面向對象 super_好好了解 Python 面向對象中的多繼承和super

可以看到,當我們執行個體化出 Son 這個對象的時候,可以使用到 YellowPeopleFather 和 play 方法,也可以使用到 WhitePersonMother 的 say 方法,當然,因為它們都繼承于 Person ,是以 Son 這個對象還可以使用 Person 的 eat 方法:

python 面向對象 super_好好了解 Python 面向對象中的多繼承和super

那麼,你有沒有想過,如果 Son 的父類們都擁有相同的方法,Son 去調用它們的時候,會調用誰的方法呢?

python 面向對象 super_好好了解 Python 面向對象中的多繼承和super

這時候運作的結果是:

python 面向對象 super_好好了解 Python 面向對象中的多繼承和super

是的,它調用的是 YellowPeopleFather 裡的方法,這是為什麼呢?

這時候我們就要了解多重繼承的子類,調用方法的順序了,在 Python 中,使用到的是 MRO(你知道它是一種算法就行,先不用深究) ,我們可以通過調用子類的 mro 方法來具體檢視:

python 面向對象 super_好好了解 Python 面向對象中的多繼承和super

可以看到,這裡是調用的順序是:Son->YellowPeopleFather–>WhitePersonMother–>Person–>object。

因為我們的 Son 類沒有定義 eat 方法,是以我們才會看到 Son 是調用了 YellowPeopleFather 裡的 eat 方法。

那麼到這裡,我要跟你說 super 的本質意思了,當你調用 super 的時候,其實是調用 MRO 順序的下一個類。

比如:

python 面向對象 super_好好了解 Python 面向對象中的多繼承和super

這樣我們調用到的是 Son 裡面的方法,沒毛病吧? 那麼此時我們想在 Son 裡面使用 YellowPeopleFather 的 eat 方法,怎麼用呢?根據 MRO 這個順序:Son->YellowPeopleFather–>WhitePersonMother–>Person–>object。

那麼 super 的下一個就是啊,是以可以這樣:

python 面向對象 super_好好了解 Python 面向對象中的多繼承和super

我們可以在 super 裡面攜帶一個 MRO 順序的前一個類,也就是剛剛的代碼也可以這樣寫:

python 面向對象 super_好好了解 Python 面向對象中的多繼承和super

相同的道理,想要直接調用的是 WhitePersonMother 的 eat 方法呢?還是根據這個順序:Son->YellowPeopleFather–>WhitePersonMother–>Person–>object。

WhitePersonMother 的前一個是 YellowPeopleFather 對不對?是以就可以這樣:

python 面向對象 super_好好了解 Python 面向對象中的多繼承和super

那麼要用 Person 的,我想你應該知道了:

python 面向對象 super_好好了解 Python 面向對象中的多繼承和super

以上就是 Python 面向對象中的多繼承和 super 的使用,請你自己私底下實作一下,體會其中的過程,做好筆記和總結。

python 面向對象 super_好好了解 Python 面向對象中的多繼承和super

掃一掃

學習 Python 沒煩惱

python 面向對象 super_好好了解 Python 面向對象中的多繼承和super