17希停、類的繼承

繼承:新類不必從頭編寫烁巫,可以直接從現(xiàn)有類繼承,就自動擁有了現(xiàn)有類的所有功能宠能,只需要編寫需要的新功能即可亚隙。

繼承優(yōu)點:復(fù)用已有代碼,自動擁有了現(xiàn)有類的所有功能违崇,可精簡代碼阿弃。

1、如果一個實例是一個子類羞延,則它也是一個父類渣淳;如果實例是父類,則它不是子類伴箩。

2入愧、子類和父類是is關(guān)系

is關(guān)系指的是:黃鸝是鳥,卻不能說鳥是黃鸝

has關(guān)系指的是:學(xué)生有一本書嗤谚,不能說學(xué)生是一本書

兩個has關(guān)系的類不能繼承棺蛛,只能以屬性組合到類中,如使用Book類的bookName-> self.book=Book(bookName)

繼承特點

1呵恢、總是從某個類繼承,沒有合適的類時使用object類繼承

2媚创、調(diào)用super().__init__方法(初始化父類)

如Student類從父類繼承name和gender:super(Student,self).__init__(name,gender)

17.1 python中繼承一個類

如果已經(jīng)定義了Person類渗钉,需要定義新的StudentTeacher類時,可以直接從Person類繼承:

class Person(object):

? ? def __init__(self, name, gender):

? ? ? ? self.name = name

? ? ? ? self.gender = gender

定義Student類時,只需要把額外的屬性加上鳄橘,例如score:

class Student(Person):

? ? def __init__(self, name, gender, score):

???????? super(Student, self).__init__(name, gender)

???????? self.score = score

一定要用super(Student, self).__init__(name, gender)?去初始化父類声离,否則,繼承自PersonStudent將沒有 namegender瘫怜。

函數(shù)super(Student, self)將返回當前類繼承的父類术徊,即?Person?,然后調(diào)用__init__()方法鲸湃,注意self參數(shù)已在super()中傳入赠涮,在__init__()中將隱式傳遞,不需要寫出(也不能寫)暗挑。

17.2 python中判斷類型

函數(shù)isinstance()可以判斷一個變量的類型笋除,既可以用在Python內(nèi)置的數(shù)據(jù)類型如str、list炸裆、dict垃它,也可以用在我們自定義的類,它們本質(zhì)上都是數(shù)據(jù)類型烹看。

假設(shè)有如下的Person国拇、StudentTeacher?的定義及繼承關(guān)系如下:

當我們拿到變量p、s惯殊、t?時酱吝,可以使用isinstance判斷類型:

這說明在繼承鏈上,一個父類的實例不能是子類類型靠胜,因為子類比父類多了一些屬性和方法掉瞳。

我們再考察 s?:

s是Student類型,不是Teacher類型浪漠,這很容易理解陕习。但是,s也是Person類型址愿,因為Student繼承自Person该镣,雖然它比Person多了一些屬性和方法,但是响谓,把 s看成Person的實例也是可以的损合。

這說明在一條繼承鏈上,一個實例可以看成它本身的類型娘纷,也可以看成它父類的類型嫁审。

17.3 python中多態(tài)

類具有繼承關(guān)系,并且子類類型可以向上轉(zhuǎn)型看做父類類型赖晶,如果我們從Person?派生出StudentTeacher?律适,并都寫了一個whoAmI()?方法:

在一個函數(shù)中辐烂,如果我們接收一個變量 x,則無論該x Person捂贿、Student還是Teacher纠修,都可以正確打印出結(jié)果:

def who_am_i(x):

? ? print x.whoAmI()

p = Person('Tim', 'Male')

s = Student('Bob', 'Male', 88)

t = Teacher('Alice', 'Female', 'English')

who_am_i(p)

who_am_i(s)

who_am_i(t)

運行結(jié)果:

I am a Person, my name is Tim

I am a Student, my name is Bob

I am a Teacher, my name is Alice

這種行為稱為多態(tài)。也就是說厂僧,方法調(diào)用將作用在x的實際類型上扣草。sStudent類型,它實際上擁有自己的 whoAmI()方法以及從 Person繼承的 whoAmI方法颜屠,但調(diào)用s.whoAmI()總是先查找它自身的定義辰妙,如果沒有定義,則順著繼承鏈向上查找汽纤,直到在某個父類中找到為止上岗。

由于Python是動態(tài)語言,所以蕴坪,傳遞給函數(shù)who_am_i(x)的參數(shù)x不一定是 Person 或 Person 的子類型肴掷。任何數(shù)據(jù)類型的實例都可以,只要它有一個whoAmI()的方法即可:

class Book(object):

? ? def whoAmI(self):

? ? ? ? return 'I am a book'

這是動態(tài)語言和靜態(tài)語言(例如Java)最大的差別之一背传。動態(tài)語言調(diào)用實例方法呆瞻,不檢查類型,只要方法存在径玖,參數(shù)正確痴脾,就可以調(diào)用。

17.4 python中多重繼承

除了從一個父類繼承外梳星,Python允許從多個父類繼承赞赖,稱為多重繼承。

多重繼承的繼承鏈就不是一棵樹了冤灾,它像這樣:

看下圖:

像這樣前域,D?同時繼承自BC,也就是D擁有了A韵吨、B匿垄、C的全部功能。多重繼承通過 super()調(diào)用__init__()方法時归粉,A雖然被繼承了兩次椿疗,但__init__()只調(diào)用一次:

>>> d = D('d')

init A...

init C...

init B...

init D...

多重繼承的目的是從兩種繼承樹中分別選擇并繼承出子類,以便組合功能使用糠悼。

舉個例子届榄,Python的網(wǎng)絡(luò)服務(wù)器有TCPServer、UDPServer倔喂、UnixStreamServer铝条、UnixDatagramServer童擎,而服務(wù)器運行模式有多進程ForkingMixin?多線程ThreadingMixin兩種。

要創(chuàng)建多進程模式的 TCPServer

class MyTCPServer(TCPServer, ForkingMixin)

? ? pass

要創(chuàng)建多線程模式的 UDPServer

class MyUDPServer(UDPServer, ThreadingMixin):

? ? pass

如果沒有多重繼承攻晒,要實現(xiàn)上述所有可能的組合需要 4x2=8 個子類。

17.5 python中獲取對象信息

拿到一個變量班挖,除了用isinstance() 判斷它是否是某種類型的實例外鲁捏,還有沒有別的方法獲取到更多的信息呢?

例如萧芙,已有定義:

首先可以用type()?函數(shù)獲取變量的類型给梅,它返回一個Type?對象:

其次,可以用dir()?函數(shù)獲取變量的所有屬性:

對于實例變量双揪,dir()返回所有實例屬性动羽,包括`__class__`這類有特殊意義的屬性。注意到方法`whoAmI`也是s?的一個屬性渔期。

如何去掉`__xxx__`這類的特殊屬性运吓,只保留我們自己定義的屬性?回顧一下filter()函數(shù)的用法疯趟。

dir()返回的屬性是字符串列表拘哨,如果已知一個屬性名稱,要獲取或者設(shè)置對象的屬性信峻,就需要用getattr() setattr( )函數(shù)了:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末倦青,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子盹舞,更是在濱河造成了極大的恐慌产镐,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踢步,死亡現(xiàn)場離奇詭異癣亚,居然都是意外死亡,警方通過查閱死者的電腦和手機贾虽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門逃糟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蓬豁,你說我怎么就攤上這事绰咽。” “怎么了地粪?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵取募,是天一觀的道長。 經(jīng)常有香客問我蟆技,道長玩敏,這世上最難降的妖魔是什么斗忌? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮旺聚,結(jié)果婚禮上织阳,老公的妹妹穿的比我還像新娘。我一直安慰自己砰粹,他們只是感情好唧躲,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碱璃,像睡著了一般弄痹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嵌器,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天肛真,我揣著相機與錄音,去河邊找鬼爽航。 笑死蚓让,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的讥珍。 我是一名探鬼主播凭疮,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼串述!你這毒婦竟也來了执解?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤纲酗,失蹤者是張志新(化名)和其女友劉穎衰腌,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體觅赊,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡右蕊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吮螺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饶囚。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鸠补,靈堂內(nèi)的尸體忽然破棺而出萝风,到底是詐尸還是另有隱情,我是刑警寧澤紫岩,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布规惰,位于F島的核電站,受9級特大地震影響泉蝌,放射性物質(zhì)發(fā)生泄漏歇万。R本人自食惡果不足惜揩晴,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贪磺。 院中可真熱鬧硫兰,春花似錦、人聲如沸寒锚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽壕曼。三九已至,卻和暖如春等浊,著一層夾襖步出監(jiān)牢的瞬間腮郊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工筹燕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留轧飞,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓撒踪,卻偏偏與公主長得像过咬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子制妄,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

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

  • 20- 枚舉,枚舉原始值,枚舉相關(guān)值,switch提取枚舉關(guān)聯(lián)值 Swift枚舉: Swift中的枚舉比OC中的枚...
    iOS_恒仔閱讀 2,278評論 1 6
  • 繼承 繼承一個類: 如果已經(jīng)定義了Person類掸绞,需要定義新的Student和Teacher類時,可以直接從Per...
    勤快的樹懶閱讀 314評論 0 0
  • 要點: 函數(shù)式編程:注意不是“函數(shù)編程”耕捞,多了一個“式” 模塊:如何使用模塊 面向?qū)ο缶幊蹋好嫦驅(qū)ο蟮母拍钕蔚А傩浴?..
    victorsungo閱讀 1,504評論 0 6
  • Python進階框架 希望大家喜歡,點贊哦首先感謝廖雪峰老師對于該課程的講解 一俺抽、函數(shù)式編程 1.1 函數(shù)式編程簡...
    Gaolex閱讀 5,498評論 6 53
  • 定義類并創(chuàng)建實例 在Python中敞映,類通過 class 關(guān)鍵字定義。以 Person 為例磷斧,定義一個Person類...
    績重KF閱讀 3,952評論 0 13