python--8、面向对象的深入知识
面向?qū)ο蟮娜筇匦?/strong>
上一篇我們講的主要內(nèi)容都符合面向?qū)ο蟮姆庋b特性。那么問題來了?面向?qū)ο箅y道只有封裝性么?當(dāng)然不是,作為一個(gè)這么難理解的東西,要是只有封裝性都對不起我們死了這么多腦細(xì)胞!所以,晴天霹靂來了,面向?qū)ο笥腥筇匦?#xff0c;他們分別是:封裝、繼承和多態(tài)。
好消息和好消息和好消息,好消息一:封裝我們已講完,所以三座大山我們已經(jīng)移走了一座,好消息二:由于python的特殊性,多態(tài)的應(yīng)用并不廣泛,所以我們其實(shí)還有一座半就勝利了,好消息三:前面那兩條好消息都是真的。閑話少敘,今天咱們就聊聊繼承,移走一座是一座!
正題——面向?qū)ο蟮睦^承性
一、繼承
大學(xué)同學(xué)聚會(huì),同桌吃飯,我們都是人,都有吃飯、喝飲料這些行為,但是畢業(yè)之后大家都做了不同的工作,有的當(dāng)了會(huì)計(jì)、有的做了程序員,現(xiàn)在我們得到了描述這些同學(xué)這個(gè)需求,我們一看非常開心,我們可以實(shí)現(xiàn)呀,然后寫下了下面左圖的代碼:
??????????????????????????????????
我們看上面左側(cè)的代碼,這么寫確實(shí)實(shí)現(xiàn)了我們的需求,但是,寫了那么多行,真正不一樣的只有黃色框框里面的內(nèi)容,好在大學(xué)同學(xué)的職業(yè)都差不多,這要是高中聚會(huì)可就熱鬧了。這個(gè)時(shí)候,我們就想,有沒有可能我們不重復(fù)寫之前的代碼,也實(shí)現(xiàn)同樣的功能呢?當(dāng)然啦!→_→右側(cè)這段代碼。看著就簡潔了不少,這就是類的繼承。現(xiàn)在你看著好像有點(diǎn)兒迷糊,沒關(guān)系,這里只需要知道有一種簡單的方法可以實(shí)現(xiàn),這種寫法就叫做繼承。具體我們后面還要詳細(xì)講。
???
我們來詳細(xì)看看上面這張圖,解釋一下什么叫做繼承,首先在最上面的黃框框里,我們定義了一個(gè)類叫做classmate,這個(gè)里面放了吃、喝兩個(gè)方法,下面我們又定義了兩個(gè)類,pythoner和accounting類,里面各寫了一個(gè)occupation方法,打印出了人物的職業(yè)。我們看到,classmate類和我們之前見到的類并沒什么不同,可是pythoner和accounting類定義的時(shí)候,我們看紅框框里寫了classmate類的類名,我們說,這樣就實(shí)現(xiàn)了繼承。pythoner和accounting類集成了classmate的所有屬性和方法。
說完了繼承類的定義,我們再來看看實(shí)例化和調(diào)用,我們看上面右側(cè)那張小圖,我們分別實(shí)例化了兩個(gè)對象,eva和sweet,注意看紅框框里我們實(shí)例化的是pythoner和accounting這兩個(gè)派生類,但是我們卻可以調(diào)用classmate的eat和drink方法,而且我們在occupation中也可以使用父類的name屬性。magic!代碼在下面~
二、多繼承現(xiàn)在我們基本可以使用類的繼承描述同坐一桌的同學(xué)們了,但是我們現(xiàn)在又有了一個(gè)新需求,就是把這一桌的男生和女生分開,男生喝酒,女生喝飲料,這個(gè)需求怎么用類來區(qū)別呢?先上圖~
????
? ???????????????????????????
我們看上面左側(cè)這張圖,由于需求的增加,要求把同桌的男生和女生分開,我又新寫了兩個(gè)female和male類重新定義drink方法,并且又定義了新的類fe_pythoner和ma_pythoner,所以這兩個(gè)類什么也不做,只是分別繼承female、classmate和male、classmate類。在實(shí)例化對象的時(shí)候我們使用fe_pythoner和ma_pythoner,我們這樣猜想,這個(gè)時(shí)候?qū)ο骵va和sweet是不是應(yīng)該分別去調(diào)用female和male中的drink方法呢?執(zhí)行下,看看下面的結(jié)果。什么鬼?竟然還是輸出了基類的drink方法。再看看右邊,沒錯(cuò),我只是在定義基類的時(shí)候讓基類繼承了object,它就可以按照我們想要的方法輸出了。
三、經(jīng)典類的深度優(yōu)先和新式類的廣度優(yōu)先
那么原理是什么呢?這個(gè)時(shí)候我就要盜一張圖來解釋這個(gè)問題了:
???
我們看上面的圖,先放兩句概念上來嚇唬嚇唬你:
- 當(dāng)類是經(jīng)典類時(shí),多繼承情況下,會(huì)按照深度優(yōu)先方式查找
- 當(dāng)類是新式類時(shí),多繼承情況下,會(huì)按照廣度優(yōu)先方式查找
那么什么是經(jīng)典類和新式類呢?簡而言之,繼承自object的類就叫做新式類,object類是python提供的,現(xiàn)在我們還不需要管它從哪里來,因?yàn)樽岊愔械暮芏嗖僮髯兊酶侠砹?#xff0c;我們以后記著就這么寫就對了。注:下面小伙伴提到,python3.X版本中的類繼承默認(rèn)就是廣度優(yōu)先。
下面來說廣度優(yōu)先和深度優(yōu)先,首先,B和C兩個(gè)類都必須繼承自D,A類又繼承自B、C,就是針對這種情況,沒有為什么。。。背下來!我們對應(yīng)起來看,這里的基類D就是上例中的classmate,BC就是pythoner和female,A則對應(yīng)fe_pythoner類。
經(jīng)典類中:當(dāng)我們這樣寫:fe_pythoner(pythoner,female),對象調(diào)用方法的時(shí)候,會(huì)先在fe_pythoner里面找,然后依次去找pythoner、classmate、最后再找female。如果找到了,就會(huì)執(zhí)行,并且不再繼續(xù)找下去了。所以我們剛剛在左側(cè)舉出得栗子中它先找到了classmate中的drink方法,才打印出了同樣的內(nèi)容。這就是深度優(yōu)先。
新式類中:當(dāng)我們這樣寫:fe_pythoner(pythoner,female),對象調(diào)用方法的時(shí)候,會(huì)先在fe_pythoner里面找,然后依次去找pythoner、female、最后再找classmate。如果找到了,就會(huì)執(zhí)行,并且不再繼續(xù)找下去了。所以我們剛剛在右側(cè)舉得栗子中它先找到了female、或male中的drink方法,就打印了不同的內(nèi)容。這就是廣度優(yōu)先。
如果上面那些你通通沒搞清楚,也沒關(guān)系,在繼承的時(shí)候可以直接把female類寫在前面 fe_pythoner(female,pythoner),這么一來不管怎么樣,都是先找female了。參考:http://www.cnblogs.com/wupeiqi/p/4493506.html
轉(zhuǎn)載于:https://www.cnblogs.com/jinyudong/p/7818730.html
總結(jié)
以上是生活随笔為你收集整理的python--8、面向对象的深入知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java基础之集合归总
- 下一篇: python报错 TypeError: