今天咱們聊點啥呢?要不還是聊點Python基礎的東東吧,大家已經都知道啦,Python呢是一種面向對象的腳本編程語言,那面向對象的編程語言呢,都會支持面向對象的三大特性,你知道是哪三大特性嗎?當然是咱們常常掛在嘴邊的封裝、繼承和多態啦,那今天呢,咱們就先說個用得最多的繼承吧,好啦,就重點講講Python相關的類的繼承啦!
好啦,那咱們就開始聊聊吧!
Python類的定義
首先開門見山說一下哦,Python的類的繼承是支持多繼承機制的。
那Python的類的繼承是怎樣的呢?其實呢,Python的類繼承很簡單哦,就是在定義子類時,將多個父類放在子類后面的圓括號中就可以啦!語法格式如下所示哦:
class SubClass (SuperClass1, SuperClass2, ...)
看到了嗎,Python類的繼承定義的格式是不是很簡單哦!只要在子類的后面加個圓括號,然后在括號里面添加上所要繼承的父類就可以啦!
其實呢,Python類和其他面向對象語言是一樣滴,如果不顯示定義繼承一個父類,也是有個默認的公共父類哦,它就是object類,所以呀,object類是所有Python類的父類哦,有兩種可能哦,一種可能是其直接父類,另一種可能呢當然就是其間接父類啦!
其實呢,如果從Python子類和其父類兩個角度來看的話,是兩種不同的效果哦,子類呢就相當于對父類進行了擴展啦,而父類呢則是派生出子類啦!
好啦,為了讓大家對Python類的繼承有深入的理解,咱們還是老規矩啦,舉個“栗子”:

好啦,看到了嗎,上面的“栗子”程序中呢,定義了兩個父類,分別是Animal類和Pig類哦,然后呢,定義了一個子類Peggy,它繼承了兩個父類,這個Peggy子類呢并木有定義自己的程序單元哦,所以就用pass代替啦!
這樣,當主程序創建了Peggy類對象后呢,就可以訪問Peggy類中的對象啦,分別是繼承自父類Animal的info()方法和繼承自Pig類的taste()方法,這就是繼承的強大作用,就是相當于子類Peggy擴展了父類Animal和Pig哦。
好啦,咱們運行一下上面這個“栗子”看看結果吧:

Python的多繼承
前面咱們說啦,Python是支持多繼承的,但是呢,還是不建議大家用哦,因為多繼承干的活單繼承都能干哦,而且,單繼承在流程和思路來說更為清晰和易懂哦!
到這可能大家有問題啦:人家Python自身都支持多繼承啦,你為啥還不推薦大家用呢,存在和支持就是有道理的啊?好啦,為了解答大家的這個疑惑,咱們就來聊聊多繼承的弊端吧!
首先呢,咱們來假定一個場景,就是哈,當一個子類有多個直接父類,也就是多繼承的話,這個子類呢就會繼承得到它的所有父類的方法哦,這是大家所清楚的,但是呢,如果這個子類所繼承的多個父類中存在同名的方法時呢,這時會出現什么情況呢?在這呢,俺先賣個關子,咱們還是老慣例,舉個“栗子”讓大家看看啦,這樣印象更深刻哦!

好啦,看到上面這個“栗子”了嗎,咱們分別定義了兩個父類SuperClass1和SuperClass2,這兩個父類呢,有個共同點,就是包含相同的info()方法哦,這是咱們再定義一個繼承了這兩個父類的子類SubClass,這時呢,咱們再主程序中創建了子類SubClass的對象,然后用子類對象sc去調用info()方法,你們猜這是會發生什么情況呢?
可以運行一下看看哦:

看到了嗎,運行后輸出的是父類SuperClass1中的info()方法!在這先不給大家解釋哦,咱們修改一下上面的“栗子”,將SubClass子類所繼承的兩個父類的順序調換一下,看看結果如何哦,程序就編程如下樣式啦:

將兩個父類的繼承順序進行了位置調換哦,這時咱們再運行看看結果如何哦:

看到了嗎,這時輸出的是父類SuperClass2中的info()方法哦!
好啦,到這呢,可能已經由朋友看明白了,其實呢,在Python的多繼承中,如果子類所繼承的父類中出現了相同的方法,這時就會和子類所繼承的父類的順序有關哦,排在前面的父類中的方法就會遮蓋排在后面的父類中的方法哦!當然啦,如果子類所繼承的父類中沒有相同的方法,就和父類的順序沒有關系啦,因為子類所調用的父類的方法會按所繼承的父類的順序查找,這時父類因為沒有相同的方法,也就是方法是唯一的,它就是找到這個方法所在的父類,然后進行調用哦!對于這點大家一定要牢記哦!
好啦,關于Python多繼承的弊端,相信大家通過上面的介紹已經深刻理解了哈,因此呢,還是建議大家盡量少用多繼承哦!
好啦,今天關于Python的類繼承相關的東東就先和大家聊這么多吧,咱們下次再見哦![再見]
敬請關注“品位集結號”,為您帶來意外的小知識![比心][握手][比心]
