Python中面向?qū)ο笥腥筇卣鳎悍庋b,繼承,多態(tài)
今天就說說面向?qū)ο笾械牡诙筇卣鳌^承
一丶什么是繼承
? ? ? ?一個類型繼承另一個類型,當(dāng)前類型就會擁有另一個類型的公共的屬性和方法,在當(dāng)前類型中使用上一個類型的屬性和方法時就可以不用定義直接調(diào)用即可
二丶繼承的目的
? ? ? ?我們知道使用面向?qū)ο缶幊痰哪康模禾岣叽a的復(fù)用性,功能的擴(kuò)展性,代碼的低耦合特性,代碼的健壯性等等,所以當(dāng)一個新的類型能擁有另一個類型的公共屬性和方法時,就可以達(dá)到代碼重復(fù)使用的目的
三丶繼承的語法
? ? ? 在定義一個類的時候我們用 class 名稱: 來定義,里面省略了(object),所以定義一個繼承類的時候就可以用:class類型(被繼承的類型): 的語法
? ? ? 其中被繼承的類型被稱為——父類,父類并不能使用子類中的所有屬性和方法
? ? ? 這個新類型就被稱為——子類,子類可以擁有父類的所有共有屬性和方法,并且可以定義自己新的屬性和方法,這些自己的屬性方法不論是否私有,都不能被父類使用


? ? ? ?通過圖1和圖2可以看出子類并沒有定義,但是卻輸出了父類的屬性,使用了父類的方法(推銷蘭州拉面23333)
四丶繼承的操作之繼承鏈
? ? ? 了解了繼承的特點,我們可以猜想子類繼承了父類后再作為新的子類的父類,定義一個新的子類,那么這樣的間接繼承會不會讓新的子類擁有父類和父類的父類中的屬性和方法,答案是肯定的,通俗的講? A 繼承 B,B 繼承 C,C 繼承 D,即A直接繼承了B,間接繼承了C,D;此時A創(chuàng)建的對象,可以同時使用B,C,D中所有公共的屬性和方法,例如圖3圖4


五丶繼承的操作之多繼承
? ? ? ? 顧名思義,多繼承就是一個子類可以繼承多個父類,這一個子類可以擁有所有父類的公共屬性和方法,如圖5

? ? ? ?那么問題來了,我們在寫完程序后可以明顯看到,兩個父類中都有eat方法,那么到底會執(zhí)行哪一個父類中的eat方法哪?圖6

? ? ? ? 通過執(zhí)行結(jié)果可以看出,執(zhí)行的是Chinese父類中的eat方法,原來在繼承中程序執(zhí)行方法的時候,程序自己尋找該方法的順序是:自身——>定義繼承的第一個父類(也就是Tom(Chinese,Japanese))中的Chinese,——>定義的第二,第三,...第N個父類
? ? ? ?所以:在進(jìn)行代碼設(shè)計的過程中,可能會出現(xiàn)多繼承,所以盡量不要在父類中定義相同名稱的屬性或者方法,如果父類中出現(xiàn)了相同名稱的屬性和方法,在使用的時候子類調(diào)用時會優(yōu)先繼承優(yōu)先調(diào)用。
六丶方法重寫
? ? ? ?子類在自己類中重新定義父類中已經(jīng)存在的方法,在執(zhí)行該方法時,如果子類中沒有重寫就直接調(diào)用父類的方法,如果子類重寫了該方法,就直接調(diào)用子類重寫的方法,同樣還是因為程序的執(zhí)行順序,優(yōu)先找到了子類中的同名新方法,所以就執(zhí)行了新的方法——方法重寫
七丶調(diào)用父類的屬性
? ? ? ? 既然子類可以擁有父類的所有公共屬性和方法,那么當(dāng)我們在子類的方法中需要用到繼承自父類的屬性時,可以通過如下兩種方式調(diào)用,如圖7
class User(Person):
? ? ? ?def?__init__(self,?name,?age):
? ? ? ? ? ? ? #直接通過父類的類名稱調(diào)用父類的屬性和方法
? ? ? ? ? ? ? Person.__init__(name,?age)
? ? ? ? ? ? ? #通過super()來調(diào)用父類的屬性和方法
? ? ? ? ? ? ? super().__init__(name,?age)

八丶小結(jié)
? ? ? ?以上就是面向?qū)ο蟮牡诙筇卣鳌^承的定義和使用方法,通過類的繼承,可以大大提高代碼的復(fù)用性,方法并不冗雜,主要還是要有自己的思路,能夠在自己的代碼寫完之后,能多思考有沒有很多相似的代碼可以簡化和合并,思路才是關(guān)鍵通過學(xué)習(xí)能有自己的想法和套路才能寫出優(yōu)秀的程序,那么下次再見
