繼承和多態(tài)

繼承和多態(tài):

在OOP程序設(shè)計(jì)中,當(dāng)我們定義一個(gè)class的時(shí)候脚翘,可以從某個(gè)現(xiàn)有的class繼承灼卢,新的class稱為子類(Subclass),而被繼承的class稱為基類来农、父類或超類(Base class鞋真、Super class)。

假設(shè)有個(gè)父類是Animal,它有run()的方法沃于,

再設(shè)立兩個(gè)子類Dog(Animal)涩咖,Cat(Animal),繼承了父類海诲,這兩個(gè)子類自動(dòng)就擁有了run()方法,就算這兩個(gè)子類沒(méi)有定義run()方法檩互。

繼承有什么好處特幔?最大的好處是子類獲得了父類的全部功能。由于Animal實(shí)現(xiàn)了run()方法闸昨,因此敬辣,Dog和Cat作為它的子類,什么事也沒(méi)干零院,就自動(dòng)擁有了run()方法溉跃。

tips:判斷一個(gè)變量是否是某個(gè)類型可以用isinstance()判斷,提到很多次,應(yīng)該是忘不掉了告抄。

在繼承關(guān)系中撰茎,如果一個(gè)實(shí)例的數(shù)據(jù)類型是某個(gè)子類,那它的數(shù)據(jù)類型也可以被看做是父類打洼。但是龄糊,反過(guò)來(lái)就不行:Dog可以看成Animal,但Animal不可以看成Dog募疮。

多態(tài)的好處:

多態(tài)的好處就是炫惩,當(dāng)我們需要傳入Dog、Cat阿浓、Tortoise……時(shí)他嚷,我們只需要接收Animal類型就可以了,因?yàn)镈og芭毙、Cat筋蓖、Tortoise……都是Animal類型,然后退敦,按照Animal類型進(jìn)行操作即可粘咖。由于Animal類型有run()方法,因此侈百,傳入的任意類型瓮下,只要是Animal類或者子類,就會(huì)自動(dòng)調(diào)用實(shí)際類型的run()方法钝域,這就是多態(tài)的意思:

對(duì)于一個(gè)變量讽坏,我們只需要知道它是Animal類型,無(wú)需確切地知道它的子類型网梢,就可以放心地調(diào)用run()方法震缭,而具體調(diào)用的run()方法是作用在Animal、Dog战虏、Cat還是Tortoise對(duì)象上拣宰,由運(yùn)行時(shí)該對(duì)象的確切類型決定党涕,這就是多態(tài)真正的威力:調(diào)用方只管調(diào)用,不管細(xì)節(jié)巡社,而當(dāng)我們新增一種Animal的子類時(shí)膛堤,只要確保run()方法編寫(xiě)正確,不用管原來(lái)的代碼是如何調(diào)用的晌该。這就是著名的“開(kāi)閉”原則:

對(duì)擴(kuò)展開(kāi)放:允許新增Animal子類肥荔;

對(duì)修改封閉:不需要修改依賴Animal類型的run_twice()等函數(shù)。

類的樹(shù)形圖:子類可以繼承父類

動(dòng)態(tài)語(yǔ)言(鴨子類型)與靜態(tài)語(yǔ)言的區(qū)別:

對(duì)于靜態(tài)語(yǔ)言(例如Java)來(lái)說(shuō)朝群,如果需要傳入Animal類型燕耿,則傳入的對(duì)象必須是Animal類型或者它的子類,否則姜胖,將無(wú)法調(diào)用run()方法誉帅。

對(duì)于Python這樣的動(dòng)態(tài)語(yǔ)言來(lái)說(shuō),則不一定需要傳入Animal類型右莱。我們只需要保證傳入的對(duì)象有一個(gè)run()方法就可以了蚜锨。

class Timer(object):

def run(self):

print('Start...')

沒(méi)有繼承Animal類,但是也能調(diào)用

這就是動(dòng)態(tài)語(yǔ)言的“鴨子類型”慢蜓,它并不要求嚴(yán)格的繼承體系亚再,一個(gè)對(duì)象只要“看起來(lái)像鴨子,走起路來(lái)像鴨子”晨抡,那它就可以被看做是鴨子氛悬。(還是不太理解)

自己的例子:

創(chuàng)建一個(gè)Animal類:

>>> class Animal(object):

...? ? def run(self):

...? ? ? ? ? ? print 'Animal is running...'

...? ? def run_twice(self):

...? ? ? ? ? ? self.run()

...? ? ? ? ? ? self.run()

...

創(chuàng)建一個(gè)Timer類

>>> class Timer(object):

...? ? def run(self):

...? ? ? ? ? ? print('Start...')

...

創(chuàng)建一個(gè)Cat類(繼承Animal)

>>> class Cat(Animal):

...? ? pass

...

創(chuàng)建一個(gè)Fuck類(繼承Timer)

>>> class Fuck(Timer):

...? ? pass

...

實(shí)例化對(duì)象:f = Fuck(),c = Cat()

>>> f.run()

Start...

>>> c.run()

Animal is running...

>>>

在我看來(lái)凄诞,run()這個(gè)方法在兩個(gè)父類都有圆雁,但在兩個(gè)子類中,run()這個(gè)方法起到的效果卻截然不通帆谍,兩個(gè)run()看起來(lái)很像,但是卻不相同轴咱。就像100美元和100RMB汛蝙,兩張面值都是100,但是能買(mǎi)到的東西卻不是等價(jià)的

Python的“file-like object“就是一種鴨子類型。對(duì)真正的文件對(duì)象朴肺,它有一個(gè)read()方法窖剑,返回其內(nèi)容。但是戈稿,許多對(duì)象西土,只要有read()方法,都被視為“file-like object“鞍盗。許多函數(shù)接收的參數(shù)就是“file-like object“需了,你不一定要傳入真正的文件對(duì)象跳昼,完全可以傳入任何實(shí)現(xiàn)了read()方法的對(duì)象。(自己對(duì)鴨子的用法和意義還是有待研究)

人家的評(píng)論肋乍,自己借鑒一下:

返回結(jié)果I am in 上海

I'm in 上海-浦東

我不屬于Province類或其子類鹅颊,但我有ps方法我同樣可以被調(diào)用

我不屬于Province類火氣子類,但我有ps1方法我同樣可以被調(diào)用

好像意思是墓造,A和B兩個(gè)類都有c方法堪伍,當(dāng)c方法傳入A類作為參數(shù),c方法的作用就是A類的c方法的作用觅闽;當(dāng)c方法傳入B類作為參數(shù)帝雇,c方法的作用就是B類的c方法的作用。

小結(jié)

繼承可以把父類的所有功能都直接拿過(guò)來(lái)蛉拙,這樣就不必重零做起摊求,子類只需要新增自己特有的方法,也可以把父類不適合的方法覆蓋重寫(xiě)刘离。

動(dòng)態(tài)語(yǔ)言的鴨子類型特點(diǎn)決定了繼承不像靜態(tài)語(yǔ)言那樣是必須的室叉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市硫惕,隨后出現(xiàn)的幾起案子茧痕,更是在濱河造成了極大的恐慌,老刑警劉巖恼除,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踪旷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡豁辉,警方通過(guò)查閱死者的電腦和手機(jī)令野,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)徽级,“玉大人气破,你說(shuō)我怎么就攤上這事〔颓溃” “怎么了现使?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)旷痕。 經(jīng)常有香客問(wèn)我碳锈,道長(zhǎng),這世上最難降的妖魔是什么欺抗? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任售碳,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贸人。我一直安慰自己间景,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布灸姊。 她就那樣靜靜地躺著拱燃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪力惯。 梳的紋絲不亂的頭發(fā)上碗誉,一...
    開(kāi)封第一講書(shū)人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音父晶,去河邊找鬼哮缺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛甲喝,可吹牛的內(nèi)容都是我干的尝苇。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼埠胖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼糠溜!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起直撤,我...
    開(kāi)封第一講書(shū)人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤非竿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后谋竖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體红柱,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年蓖乘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锤悄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嘉抒,死狀恐怖零聚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情众眨,我是刑警寧澤握牧,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站娩梨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏览徒。R本人自食惡果不足惜狈定,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纽什,春花似錦措嵌、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至让蕾,卻和暖如春浪规,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背探孝。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工笋婿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人顿颅。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓缸濒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親粱腻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子庇配,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 在OOP程序設(shè)計(jì)中,當(dāng)我們定義一個(gè)class的時(shí)候绍些,可以從某個(gè)現(xiàn)有的class繼承捞慌,新的class稱為子類(Sub...
    chen_000閱讀 244評(píng)論 1 1
  • date: 2016-10-09 18:45:18 這里繼承和多態(tài)的概念與java的概念差不多。概念還是需要多次理...
    樸有天虹閱讀 265評(píng)論 0 0
  • 繼承有什么好處遇革?最大的好處是子類獲得了父類的全部功能卿闹。由于Animial實(shí)現(xiàn)了run()方法,因此萝快,Dog和Cat...
    牛崽兒酷閱讀 379評(píng)論 0 0
  • 在OPP程序設(shè)計(jì)中锻霎,當(dāng)我們定義一個(gè)class的時(shí)候,可以從某個(gè)現(xiàn)有的class繼承揪漩,新的class稱為子類旋恼。而被繼...
    界面大叔閱讀 254評(píng)論 0 0
  • 來(lái)自廖雪峰class(類)可以被繼承,新的class稱為子類(Subclass),被繼承的class是基類奄容、父類或...
    Ji_uu閱讀 351評(píng)論 0 0