《Python編程案例教程》(高登) 6.Python編程案例-項(xiàng)目六_第1頁(yè)
《Python編程案例教程》(高登) 6.Python編程案例-項(xiàng)目六_第2頁(yè)
《Python編程案例教程》(高登) 6.Python編程案例-項(xiàng)目六_第3頁(yè)
《Python編程案例教程》(高登) 6.Python編程案例-項(xiàng)目六_第4頁(yè)
《Python編程案例教程》(高登) 6.Python編程案例-項(xiàng)目六_第5頁(yè)
已閱讀5頁(yè),還剩59頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

項(xiàng)目六面

對(duì)

程項(xiàng)目六

Python是真正面向?qū)ο蟮母呒?jí)動(dòng)態(tài)編程語(yǔ)言,它以類和對(duì)象作為面向?qū)ο缶幊痰幕A(chǔ),具有封裝、繼承和多態(tài)三大基本特性,能夠很好地支持代碼復(fù)用和設(shè)計(jì)復(fù)用,使得代碼具有更好的可讀性和可擴(kuò)展性。本項(xiàng)目將詳細(xì)介紹Python中面向?qū)ο缶幊痰姆椒ām?xiàng)目導(dǎo)讀項(xiàng)目六理解面向?qū)ο蟪绦蛟O(shè)計(jì)思想。掌握定義類和創(chuàng)建對(duì)象的方法,self參數(shù)、構(gòu)造方法和析構(gòu)方法的使用方法。理解類變量和實(shí)例變量、類方法和靜態(tài)方法的區(qū)別。掌握面向?qū)ο蟮娜筇匦裕ǚ庋b、繼承和多態(tài))及相關(guān)知識(shí)的使用方法。能使用面向?qū)ο蠓椒ň帉?xiě)程序。學(xué)習(xí)目標(biāo)思政目標(biāo)提高對(duì)事物的觀察和歸納能力。

了解生物多樣性的重要性,增強(qiáng)保護(hù)生態(tài)環(huán)境意識(shí)。項(xiàng)目六增強(qiáng)使用抽象思維解決實(shí)際問(wèn)題的能力。Content項(xiàng)目六開(kāi)發(fā)動(dòng)物園里有什么游戲制作個(gè)人信息調(diào)查表開(kāi)發(fā)貓狗大戰(zhàn)游戲開(kāi)發(fā)“動(dòng)物園里有什么”游戲任

務(wù)

一任務(wù)一

“動(dòng)物園里有什么”游戲想要實(shí)現(xiàn)的功能是輪流說(shuō)出一種動(dòng)物的種類及叫聲,如果該動(dòng)物在預(yù)先規(guī)定的范圍中,則輸出動(dòng)物的種類及叫聲,否則終止游戲。本任務(wù)將帶領(lǐng)大家利用類和對(duì)象,開(kāi)發(fā)“動(dòng)物園里有什么”游戲。開(kāi)發(fā)“動(dòng)物園里有什么”游戲任務(wù)描述知識(shí)鏈接一、面向?qū)ο蟮某绦蛟O(shè)計(jì)傳統(tǒng)的程序設(shè)計(jì)方法被稱為面向過(guò)程的程序設(shè)計(jì)。面向過(guò)程程序設(shè)計(jì)的核心是過(guò)程,即解決問(wèn)題的步驟。面向過(guò)程的設(shè)計(jì)就好比設(shè)計(jì)一條流水線,需要考慮周全解決問(wèn)題的每個(gè)步驟,如果中間有某個(gè)環(huán)節(jié)發(fā)生了變化,那么就得重新設(shè)計(jì)流水線。因此,使用這種方法開(kāi)發(fā)的程序重用性差、難于維護(hù)。在這種情況下,面向?qū)ο蟪绦蛟O(shè)計(jì)誕生了。面向?qū)ο蟪绦蛟O(shè)計(jì)(objectorientedprogramming,OOP)是將所有預(yù)處理的問(wèn)題抽象為對(duì)象,并將相應(yīng)的屬性和行為封裝起來(lái),以提高軟件的重用性、靈活性和擴(kuò)展性?,F(xiàn)實(shí)世界中,對(duì)象就是客觀存在的某一事物,如一個(gè)人、一輛自行車等。而面向?qū)ο蟮木幊淌澜缰校瑢?duì)象具有屬性和行為兩個(gè)特征,每個(gè)對(duì)象都有各自的屬性和行為。而類是對(duì)這些具有共同特征的對(duì)象的概括、歸納和抽象表達(dá)。例如,將人抽象為“人”類,它具有名字、性別等屬性,行走、吃飯等行為,那么具體的名字為“小明”“小紅”的個(gè)體就是“人”類的對(duì)象,具體關(guān)系如圖6-1所示。任務(wù)一圖6-1類和對(duì)象的關(guān)系class類名:類體Python中定義類的語(yǔ)法格式如下。二、類的定義任務(wù)一其中,class是Python的關(guān)鍵字,用于聲明類;類名必須是合法標(biāo)識(shí)符,通常是一個(gè)有意義的名稱;類體定義類的內(nèi)部實(shí)現(xiàn),一般包括變量和方法的定義。定義類時(shí)應(yīng)注意以下幾點(diǎn)。(1)類名的首字母一般需要大寫(xiě),如Car。(2)類名后必須緊跟冒號(hào)。(3)類體相對(duì)于class關(guān)鍵字必須保持一定的空格縮進(jìn)。例如,定義一個(gè)Person類,包含姓名屬性和說(shuō)話行為,可以用下面代碼實(shí)現(xiàn)。任務(wù)一classPerson: #定義Person類name='小藍(lán)' #定義姓名變量defspeak(self): #定義說(shuō)方法print('大家好!')在上述代碼中,使用class定義了一個(gè)名為Person的類,類中有一個(gè)name變量和一個(gè)speak()方法。從代碼中可以看出,方法的定義格式和函數(shù)是一樣的,主要區(qū)別在于,方法必須顯式地聲明一個(gè)self參數(shù),且須位于參數(shù)列表的開(kāi)頭。對(duì)象名=類名()Python中創(chuàng)建對(duì)象的語(yǔ)法格式如下。三、創(chuàng)建對(duì)象任務(wù)一創(chuàng)建對(duì)象后,可以使用它來(lái)訪問(wèn)類中的變量和方法,其語(yǔ)法格式如下對(duì)象名.變量名對(duì)象名.方法名([參數(shù)])任務(wù)一【例

6-1】創(chuàng)建對(duì)象,訪問(wèn)類中的變量和方法?!緟⒖即a】classPerson: #定義Person類name='小藍(lán)' #定義姓名變量defspeak(self): #定義說(shuō)方法print('大家好!')person=Person() #創(chuàng)建對(duì)象person.speak() #調(diào)用類中的方法print('我是{}'.format())

#訪問(wèn)類中的變量任務(wù)一【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖6-2所示。圖6-2

例6-1程序運(yùn)行結(jié)果在Python中,一個(gè)類可以生成無(wú)數(shù)個(gè)對(duì)象,當(dāng)一個(gè)對(duì)象的方法被調(diào)用時(shí),對(duì)象會(huì)將自身的引用作為第一個(gè)參數(shù)(即方法的self參數(shù)),傳遞給該方法。這樣,Python就知道需要操作哪個(gè)對(duì)象的方法了。帶self參數(shù)的方法也稱作實(shí)例方法,在類的實(shí)例方法中訪問(wèn)實(shí)例變量時(shí),須以self為前綴,但在外部通過(guò)對(duì)象名調(diào)用實(shí)例方法時(shí)不需要傳遞該參數(shù)。四、self參數(shù)任務(wù)一任務(wù)一【例

6-2】self參數(shù)的使用?!緟⒖即a】classPerson: #定義Person類defnamed(self,name): #定義命名的方法=name #賦值defspeak(self): #定義顯示名字的方法print('我的名字是{}'.format()) #輸出名字xiaolan=Person() #創(chuàng)建對(duì)象xiaoland('小藍(lán)') #xiaolan調(diào)用named()方法xiaowu=Person() #創(chuàng)建對(duì)象xiaowud('小舞') #xiaowu調(diào)用named()方法xiaolan.speak() #xiaolan調(diào)用speak()方法xiaowu.speak() #xiaowu調(diào)用speak()方法任務(wù)一【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖6-3所示。圖6-3例6-2程序運(yùn)行結(jié)果任務(wù)一

Python在類中定義方法時(shí)將第一個(gè)參數(shù)命名為self只是一個(gè)習(xí)慣,而實(shí)際上名稱是可以改變的。例如:

classA:

defshow(my):

print('hello!')

a=A()

a.show()

上述代碼中,將show()方法的第一個(gè)參數(shù)命名為my,程序運(yùn)行結(jié)果為“hello!”。構(gòu)造方法的固定名稱為_(kāi)_init__(),當(dāng)創(chuàng)建類的對(duì)象時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用構(gòu)造方法,實(shí)現(xiàn)對(duì)象的初始化操作。五、構(gòu)造方法任務(wù)一【例

6-3】構(gòu)造方法示例。【參考代碼】classPerson: #定義Person類#構(gòu)造方法,定義變量并賦初值def__init__(self):='小藍(lán)'self.snack='薯?xiàng)l'defeat(self): #定義方法,輸出變量print('{}喜歡的零食是{}'.format(,self.snack))xiaolan=Person() #創(chuàng)建對(duì)象xiaolan.eat() #調(diào)用eat()方法任務(wù)一【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖6-4所示。圖6-4例6-3程序運(yùn)行結(jié)果【程序說(shuō)明】在該程序中,第3~5行實(shí)現(xiàn)了__init__()方法,給Person類添加了name和snack屬性并賦初值,在eat()方法中訪問(wèn)了name和snack的值。例6-3中,無(wú)論創(chuàng)建多少個(gè)Person類的對(duì)象,name和snack變量的初始值都是默認(rèn)值。如果想要為不同對(duì)象初始化不同的值,可使用有參構(gòu)造方法,即在構(gòu)造方法中設(shè)置形參。創(chuàng)建對(duì)象時(shí),為不同對(duì)象傳入不同的實(shí)參,并將每個(gè)對(duì)象的變量初始化為實(shí)參的值。任務(wù)一【例

6-4】有參構(gòu)造方法示例?!緟⒖即a】classPerson: #定義Person類#構(gòu)造方法,定義變量并賦初值def__init__(self,name,snack):=nameself.snack=snackdefeat(self): #定義方法,輸出變量print('{}喜歡的零食是{}'.format(,self.snack))xiaolan=Person('小藍(lán)','薯?xiàng)l')

#創(chuàng)建對(duì)象xiaolanxiaolan.eat()

#xiaolan調(diào)用eat()方法xiaowu=Person('小舞','冰激凌')

#創(chuàng)建對(duì)象xiaowuxiaowu.eat()

#xiaowu調(diào)用eat()方法任務(wù)一【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖6-5所示。圖6-5例6-4程序運(yùn)行結(jié)果【程序說(shuō)明】在該程序中,第3~5行定義了帶參數(shù)的構(gòu)造方法,包含兩個(gè)參數(shù)name和snack,創(chuàng)建對(duì)象時(shí),可為不同對(duì)象傳入不同的參數(shù)值。Python中每個(gè)類有且僅有一個(gè)構(gòu)造方法,即便不手動(dòng)為類添加任何構(gòu)造方法,創(chuàng)建對(duì)象時(shí),也會(huì)隱式地調(diào)用只包含self參數(shù)的構(gòu)造方法。創(chuàng)建對(duì)象時(shí),Python解釋器會(huì)默認(rèn)調(diào)用構(gòu)造方法;當(dāng)需要?jiǎng)h除一個(gè)對(duì)象來(lái)釋放其所占的資源時(shí),Python解釋器會(huì)調(diào)用析構(gòu)方法。析構(gòu)方法的固定名稱為_(kāi)_del__(),程序結(jié)束時(shí)會(huì)自動(dòng)調(diào)用該方法,也可以使用del語(yǔ)句手動(dòng)調(diào)用該方法刪除對(duì)象。六、析構(gòu)方法任務(wù)一【例

6-5】比較下面兩個(gè)程序,分析輸出結(jié)果。【代碼一】classPerson():def__init__(self): #構(gòu)造方法print('---調(diào)用構(gòu)造方法創(chuàng)建對(duì)象---')def__del__(self): #析構(gòu)方法print('---調(diào)用析構(gòu)方法刪除對(duì)象---')person=Person() #創(chuàng)建對(duì)象print('---程序結(jié)束---')任務(wù)一【代碼二】classPerson():def__init__(self): #構(gòu)造方法print('---調(diào)用構(gòu)造方法創(chuàng)建對(duì)象---')def__del__(self): #析構(gòu)方法print('---調(diào)用析構(gòu)方法刪除對(duì)象---')person=Person() #創(chuàng)建對(duì)象delperson #刪除對(duì)象print('---程序結(jié)束---')【運(yùn)行結(jié)果】圖6-6代碼一運(yùn)行結(jié)果圖6-7代碼二運(yùn)行結(jié)果任務(wù)一【程序說(shuō)明】以上兩段代碼的區(qū)別在于:代碼二在程序結(jié)束前使用del語(yǔ)句手動(dòng)調(diào)用析構(gòu)方法刪除對(duì)象,因此,先輸出“---調(diào)用析構(gòu)方法刪除對(duì)象---”;而代碼一沒(méi)有使用del語(yǔ)句,因此,在程序結(jié)束時(shí)才調(diào)用析構(gòu)方法,后輸出“---調(diào)用析構(gòu)方法刪除對(duì)象---”。任務(wù)實(shí)施完成本任務(wù),須首先定義動(dòng)物類,然后循環(huán)輸入動(dòng)物的種類及叫聲,判斷是否在指定列表中,具體實(shí)現(xiàn)步驟如下。(1)定義動(dòng)物類Animal,包含動(dòng)物種類(species)和叫聲(sound)等變量,以及構(gòu)造方法和叫方法speak()。其中,構(gòu)造方法判斷傳入的動(dòng)物種類參數(shù)是否在指定列表中,如果在列表中,species和sound賦值為傳入的參數(shù),否則賦值為None;speak()方法判斷species是否為None,如果是,提示游戲結(jié)束,并返回False,否則輸出species和sound的值,并返回True。(2)定義循環(huán)標(biāo)志flag,初始值為T(mén)rue。在循環(huán)中,輸入動(dòng)物的種類和叫聲(使用空格隔開(kāi)),并分割輸入的字符串,返回一個(gè)列表;然后以列表的元素作為參數(shù)創(chuàng)建對(duì)象;最后調(diào)用speak()方法,將返回值賦給flag。制作個(gè)人信息調(diào)查表任

務(wù)

個(gè)人信息調(diào)查表可根據(jù)調(diào)查目的統(tǒng)計(jì)個(gè)人的相關(guān)信息,如居住城市、姓名、年齡、愛(ài)好和常用的App等,用于人群數(shù)據(jù)分析。本任務(wù)將帶領(lǐng)大家編寫(xiě)Python程序,使用類變量和實(shí)例變量,制作個(gè)人信息調(diào)查表。任務(wù)二制作個(gè)人信息調(diào)查表任務(wù)描述知識(shí)鏈接

一、類變量和實(shí)例變量Python類中定義的變量包括兩種:類變量和實(shí)例變量,它們有以下兩點(diǎn)區(qū)別。(1)類變量是在類中所有方法外定義的;實(shí)例變量一般是指在構(gòu)造方法__init__()中定義的,在類中定義和使用時(shí)必須以self作為前綴。任務(wù)二與很多面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言不同,Python允許在類外部動(dòng)態(tài)地為類和對(duì)象增加變量,這是Python動(dòng)態(tài)類型特點(diǎn)的重要體現(xiàn)。(2)類變量屬于類,可以通過(guò)類名或?qū)ο竺L問(wèn);而實(shí)例變量屬于實(shí)例(即對(duì)象),在主程序中(或類的外部)只能通過(guò)對(duì)象名訪問(wèn)。任務(wù)二【例

6-6】類變量和實(shí)例變量示例?!緟⒖即a】classToy: #定義Toy類type='小車' #初始化類變量def__init__(self,color):self.color=color #初始化實(shí)例變量toy=Toy('紅色') #創(chuàng)建對(duì)象#訪問(wèn)類變量和實(shí)例變量并輸出print(Toy.type,toy.type,toy.color)Toy.wheelNum=4 #增加類變量toy.price=5 #增加實(shí)例變量#訪問(wèn)增加的類變量和實(shí)例變量并輸出print(Toy.wheelNum,toy.wheelNum,toy.price)任務(wù)二【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖6-9所示。圖6-9例6-6程序運(yùn)行結(jié)果【程序說(shuō)明】Toy類中定義的type和動(dòng)態(tài)為類增加的wheelNum都為類變量,因此,它們都屬于類,可以通過(guò)類名或?qū)ο竺L問(wèn)。但構(gòu)造方法中定義的color和動(dòng)態(tài)為對(duì)象toy增加的price都為實(shí)例變量,因此,它們只能通過(guò)對(duì)象名訪問(wèn),如果用類名進(jìn)行訪問(wèn)會(huì)提示錯(cuò)誤信息。例如,在程序的末尾增加一條語(yǔ)句“print(Toy.color)”,程序運(yùn)行出錯(cuò),提示Toy對(duì)象沒(méi)有color屬性,運(yùn)行結(jié)果如圖6-10所示。任務(wù)二如果類中有相同名稱的類變量和實(shí)例變量,通過(guò)對(duì)象名訪問(wèn)變量時(shí)獲取的是實(shí)例變量的值,通過(guò)類名訪問(wèn)變量時(shí)獲取的是類變量的值。圖6-10錯(cuò)誤提示任務(wù)二【例

6-7】類中有相同名稱的類變量和實(shí)例變量示例?!緟⒖即a】classToy: #定義Toy類color='白色' #初始化類變量def__init__(self):self.color='紅色' #初始化實(shí)例變量toy=Toy() #創(chuàng)建對(duì)象print(Toy.color,toy.color)

#訪問(wèn)類變量和實(shí)例變量并輸出任務(wù)二【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖6-11所示。圖6-11例6-7程序運(yùn)行結(jié)果【程序說(shuō)明】從程序運(yùn)行結(jié)果可以看出,類變量和實(shí)例變量的名稱相同,都為color,通過(guò)類名Toy訪問(wèn)color(Toy.color)時(shí)獲取的是類變量的值“白色”,而通過(guò)對(duì)象名toy訪問(wèn)color(toy.color)時(shí)獲取的是實(shí)例變量的值“紅色”。任務(wù)二二、類方法和靜態(tài)方法1.類方法類方法是類所擁有的方法,須用修飾器“@classmethod”來(lái)標(biāo)識(shí)。對(duì)于類方法,第一個(gè)參數(shù)必須是類對(duì)象,一般以cls作為第一個(gè)參數(shù)(同self一樣只是一個(gè)習(xí)慣),可以通過(guò)對(duì)象名調(diào)用類方法,也可以通過(guò)類名調(diào)用類方法。【例

6-8】類方法示例。【參考代碼】任務(wù)二classBook: #定義Book類type='課外書(shū)' #定義類變量并賦值#類方法,用classmethod進(jìn)行修飾@classmethoddefgetType(cls):returncls.type #返回類變量的值book=Book() #創(chuàng)建對(duì)象print(Book.getType()) #通過(guò)類名調(diào)用類方法print(book.getType()) #通過(guò)對(duì)象名調(diào)用類方法任務(wù)二【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖6-12所示。圖6-12例6-8程序運(yùn)行結(jié)果【程序說(shuō)明】上述代碼中定義了一個(gè)Book類,在其中添加了類變量type,然后在類方法getType()中返回type的值。從運(yùn)行結(jié)果可以看出,用對(duì)象名調(diào)用類方法和用類名調(diào)用類方法的效果是一樣的。類方法可以訪問(wèn)類變量,但無(wú)法訪問(wèn)實(shí)例變量。任務(wù)二二、類方法和靜態(tài)方法2.靜態(tài)方法要在類中定義靜態(tài)方法,須在方法前加上“@staticmethod”標(biāo)記符,以表示下面的方法是靜態(tài)方法。使用靜態(tài)方法的好處是,不需要實(shí)例化對(duì)象即可調(diào)用該方法。靜態(tài)方法沒(méi)有self參數(shù),所以它無(wú)法訪問(wèn)類的實(shí)例變量;靜態(tài)方法也沒(méi)有cls參數(shù),所以它也無(wú)法訪問(wèn)類變量。靜態(tài)方法既可以通過(guò)對(duì)象名調(diào)用,也可以通過(guò)類名調(diào)用?!纠?/p>

6-9】靜態(tài)方法示例?!緟⒖即a】任務(wù)二classBook: #定義Book類type='課外書(shū)' #定義類變量并賦值#靜態(tài)方法,用@staticmethod進(jìn)行修飾@staticmethoddefprintType():print('---書(shū)的類別---')book=Book() #創(chuàng)建對(duì)象book.printType() #通過(guò)對(duì)象名調(diào)用靜態(tài)方法Book.printType() #通過(guò)類名調(diào)用靜態(tài)方法print(book.type) #輸出type任務(wù)二【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖6-13所示。圖6-13例6-9程序運(yùn)行結(jié)果通過(guò)類的對(duì)象名可以調(diào)用實(shí)例方法、類方法和靜態(tài)方法,通過(guò)類名可以調(diào)用類方法和靜態(tài)方法。一般情況下,如果要修改實(shí)例變量的值,可直接使用實(shí)例方法;如果要修改類變量的值,可直接使用類方法;如果是輔助功能,如打印菜單等,則可以考慮使用靜態(tài)方法。任務(wù)實(shí)施完成本任務(wù),須首先定義人類Person,包含居住城市(city)、姓名(name)、年齡(age)、愛(ài)好(hobby)和常用的App(app)等變量,以及構(gòu)造方法、printMenu()方法和printInfo()方法。其中,city為類變量,初始值為“北京”,其余為實(shí)例變量;構(gòu)造方法初始化實(shí)例變量;printMenu()為靜態(tài)方法,輸出個(gè)人信息提示;printInfo()方法輸出個(gè)人信息。然后創(chuàng)建兩個(gè)對(duì)象person1和person2,分別調(diào)用printMenu()和printInfo()方法,創(chuàng)建person2前將city重新賦值為“上?!?。開(kāi)發(fā)“貓狗大戰(zhàn)”游戲任

務(wù)

“貓狗大戰(zhàn)”游戲想要實(shí)現(xiàn)的功能是通過(guò)鍵盤(pán)控制貓和狗游戲角色進(jìn)行PK,可控制動(dòng)物角色增加生命值,或者攻擊對(duì)方,對(duì)方受到攻擊會(huì)減少一定的生命值,直到一方的生命值為零結(jié)束比賽。本任務(wù)將帶領(lǐng)大家利用類的繼承,開(kāi)發(fā)“貓狗大戰(zhàn)”游戲。任務(wù)三開(kāi)發(fā)“貓狗大戰(zhàn)”游戲任務(wù)描述知識(shí)鏈接

面向?qū)ο缶幊叹哂蟹庋b、繼承和多態(tài)三大特征。一、封裝封裝是面向?qū)ο缶幊痰暮诵乃枷耄鼘?duì)象的屬性和行為封裝起來(lái)(其載體是類),隱藏其實(shí)現(xiàn)細(xì)節(jié),用戶只需通過(guò)接口來(lái)操作對(duì)象。好比用戶使用計(jì)算機(jī)時(shí),通過(guò)鍵盤(pán)就可以實(shí)現(xiàn)一些功能,無(wú)須知道計(jì)算機(jī)內(nèi)部是如何工作的。任務(wù)三【例

6-10】私有化變量和方法。【參考代碼】classPeople:

#定義People類def__init__(self,name,age):=nameself.__age=age #定義私有變量__agedef__sayHello(self):

#定義私有方法print('Hello,大家好')defgreeting(self):

#定義接口函數(shù),調(diào)用私有方法self.__sayHello()defgetAge(self):

#定義接口函數(shù),返回私有變量__age的值returnself.__agexiaolan=People('小藍(lán)',10)

#創(chuàng)建對(duì)象xiaolan.greeting() #調(diào)用接口函數(shù)#訪問(wèn)實(shí)例變量和調(diào)用接口函數(shù)并輸出print('我叫{},今年{}歲了。'.format(,xiaolan.getAge()))任務(wù)三【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖6-15所示。圖6-15例6-10程序運(yùn)行結(jié)果如果在類外部調(diào)用私有方法或訪問(wèn)私有變量,就會(huì)提示錯(cuò)誤信息。例如,在程序的末尾增加兩條語(yǔ)句“xiaolan.__sayHello()”和“print(xiaolan.__age)”,程序運(yùn)行出錯(cuò),結(jié)果如圖6-16所示。出現(xiàn)上述問(wèn)題的原因是“__sayHello()”為私有方法,類的外部無(wú)法調(diào)用類的私有方法。同理,如果程序執(zhí)行到“print(xiaolan.__age)”時(shí),也會(huì)提示類似的錯(cuò)誤信息。任務(wù)三圖6-16錯(cuò)誤提示Python目前的私有機(jī)制其實(shí)是偽私有,實(shí)際上,在外部可以通過(guò)“_類名__屬性”訪問(wèn)私有變量和調(diào)用私有方法。例如,將例6-10代碼中的最后兩條語(yǔ)句改成以下形式,也可正常運(yùn)行程序。xiaolan._People__sayHello() #類外部調(diào)用私有方法#類外部訪問(wèn)私有變量print('我叫{},今年{}歲了'.format(,xiaolan._People__age))任務(wù)三二、繼承繼承是面向?qū)ο蟪绦蛟O(shè)計(jì)中兩個(gè)類之間的一種關(guān)系,是指從已有的類中派生出新的類。被繼承的類稱為基類或父類,繼承父類的類稱為子類或派生類。子類可以繼承父類的屬性和行為,還可以增加自己的屬性和行為。例如,自行車類有品牌、外觀等屬性,剎車、加速等行為,而雙人自行車?yán)^承了自行車類(父類)的屬性和行為,還增加了后座這個(gè)屬性。子類還可以改變從父類繼承來(lái)的行為。例如,雜技演員使用的自行車不僅可以前進(jìn),還可以后退,這就改變了自行車類的行為。繼承使父類的代碼得到重用,在繼承父類提供的共同特性的基礎(chǔ)上增加新的代碼,可以大幅度減少開(kāi)發(fā)工作量,并且可以很大程度地保證質(zhì)量。繼承分為單繼承和多繼承兩種。在Python中,當(dāng)一個(gè)子類只有一個(gè)父類時(shí)稱為單繼承。定義子類的語(yǔ)法格式如下子類可以繼承父類的所有公有變量和公有方法,但不能繼承其私有變量和私有方法。class子類名(父類名):任務(wù)三【例

6-11】單繼承示例。【參考代碼】classAnimal: #定義Animal類type='動(dòng)物' #定義變量typefood='食物' #定義變量fooddefeat(self):

#定義方法輸出type和foodprint('{}吃{}'.format(self.type,self.food))classCat(Animal):

#定義Cat類繼承Animal類pass #空語(yǔ)句cat=Cat() #創(chuàng)建對(duì)象cat.eat() #調(diào)用父類方法cat.type='貓' #修改typecat.food='魚(yú)' #修改foodcat.eat() #調(diào)用父類方法任務(wù)三【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖6-17所示。圖6-17例6-11程序運(yùn)行結(jié)果【程序說(shuō)明】上述代碼中定義了Animal類,包含type和food變量,以及eat()方法;然后定義了Cat子類繼承Animal類,不執(zhí)行任何操作;最后創(chuàng)建Cat類對(duì)象,修改父類中的變量,并調(diào)用父類中的方法。從程序的運(yùn)行結(jié)果可以看出,子類繼承了父類的變量和方法。Python中pass表示空語(yǔ)句,即不執(zhí)行任何操作,一般用作占位語(yǔ)句,保持程序結(jié)構(gòu)的完整性。任務(wù)三2.多繼承

多繼承指一個(gè)子類可以有多個(gè)父類,它繼承了多個(gè)父類的特性。例如,沙發(fā)床是沙發(fā)和床的功能的組合,兒子喜歡做爸爸和媽媽喜歡做的事。多繼承可以看作是對(duì)單繼承的擴(kuò)展,其語(yǔ)法格式如下。class子類名(父類名1,父類名2……):【例

6-12】多繼承示例。任務(wù)三classDadLikeDo: #定義DadLikeDo類defbasketball(self): #定義打籃球方法print('打籃球')classMomLikeDo: #定義MomLikeDo類defsing(self): #定義唱歌方法print('唱歌')#定義SonLikeDo類,繼承DadLikeDo類和MomLikeDo類classSonLikeDo(DadLikeDo,MomLikeDo):defdance(self): #定義跳舞方法print('跳舞')son=SonLikeDo() #創(chuàng)建對(duì)象print('兒子喜歡做的事:')son.basketball() #調(diào)用DadLikeDo類的方法son.sing() #調(diào)用MomLikeDo類的方法son.dance() #調(diào)用SonLikeDo類的方法【參考代碼】任務(wù)三【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖6-18所示。圖6-18例6-12程序運(yùn)行結(jié)果【程序說(shuō)明】上述代碼中定義了DadLikeDo類,包含basketball()方法,以及定義了MomLikeDo類,包含sing()方法;然后定義了繼承DadLikeDo類和MomLikeDo類的子類SonLikeDo,包含dance()方法;最后創(chuàng)建SonLikeDo類的對(duì)象,分別調(diào)用basketball()、sing()和dance()方法。從程序運(yùn)行結(jié)果可以看出,子類同時(shí)繼承了多個(gè)父類的方法。任務(wù)三在Python中,如果兩個(gè)父類中有同名的方法,那么調(diào)用該同名方法時(shí)會(huì)調(diào)用先繼承的類中的方法。例如,如果DadLikeDo類和MomLikeDo類中有同名的方法,用“classSonLikeDo(DadLikeDo,MomLikeDo):”語(yǔ)句定義子類時(shí),子類會(huì)先繼承DadLikeDo類。任務(wù)三3.方法重寫(xiě)

當(dāng)父類中的方法無(wú)法滿足子類需求或子類具有特有功能時(shí),可以在子類中重寫(xiě)父類的方法,即子類中的方法會(huì)覆蓋父類中同名的方法,以實(shí)現(xiàn)不同于父類的功能。【例

6-13】重寫(xiě)父類的方法示例。任務(wù)三classStudent: #定義Student類name='xx' #定義變量namedefcategory(self): #定義方法category()print(+'是學(xué)生')classPupil(Student): #定義Pupil類繼承Student類defcategory(self): #重寫(xiě)category()方法print(,'是小學(xué)生')classJunior(Student): #定義Junior類繼承Student類defcategory(self): #重寫(xiě)category()方法print(,'是初中生')xioalan=Pupil() #創(chuàng)建Pupil類對(duì)象='小藍(lán)' #修改namexioalan.category() #調(diào)用category()方法xiaoming=Junior() #創(chuàng)建Junior類對(duì)象='小明' #修改namexiaoming.category() #調(diào)用category()方法【參考代碼】任務(wù)三【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖6-19所示。圖6-19例6-13程序運(yùn)行結(jié)果【程序說(shuō)明】從程序運(yùn)行結(jié)果可以看出,在調(diào)用Pupil類和Junior類對(duì)象的category()方法時(shí),只調(diào)用了子類中重寫(xiě)的方法,不會(huì)再調(diào)用父類的category()方法。如果需要在子類中調(diào)用父類的方法,可以使用內(nèi)置函數(shù)super()或通過(guò)“父類名.方法名()”來(lái)實(shí)現(xiàn)。任務(wù)三classStudent:

#定義Student類def__init__(self,name,age):

#構(gòu)造方法,傳遞name和age=nameself.age=agedefshowInfo(self):

#定義showInfo()方法,輸出name和ageprint('姓名:{};年齡:{}'.format(,self.age))classPupil(Student):

#定義Pupil類繼承Student類#構(gòu)造方法,傳遞name、age和sexdef__init__(self,name,age,sex):super().__init__(name,age)

#調(diào)用父類構(gòu)造方法self.sex=sexdefshowInfo(self):Student.showInfo(self)

#調(diào)用父類showInfo()方法print('性別:{}'.format(self.sex))#輸出sexxiaolan=Pupil('小藍(lán)',10,'女')

#創(chuàng)建對(duì)象xiaolan.showInfo()

#調(diào)用showInfo()方法【例6-14】子類調(diào)用父類的方法示例?!緟⒖即a】任務(wù)三【運(yùn)行結(jié)果】程序運(yùn)行結(jié)果如圖6-20所示。圖6-20例6-14程序運(yùn)行結(jié)果【程序說(shuō)明】以上代碼中定義了Student類,在該類的__init__()方法中定義了name和age變量。然后定義了繼承Student類的子類Pupil,在該類中重寫(xiě)了構(gòu)造方法__init__(),使用super()函數(shù)調(diào)用父類的構(gòu)造方法,并添加了自定義變量sex,使Pupil類既擁有自定義的sex,又擁有父類的name和age;還重寫(xiě)了showInfo()方法,使用父類名調(diào)用了父類的showInfo()方法輸出name和age,又輸出了sex。任務(wù)三三、多態(tài)

在Python中,多態(tài)指的是一類事物有多種形態(tài),如一個(gè)父類有多個(gè)子類,因而多態(tài)的概念依賴于繼承。而多態(tài)性可以這樣描述:向不同的對(duì)象發(fā)送同一條消息,不同的對(duì)象在接收時(shí)會(huì)產(chǎn)生不同的行為(即方法)。也就是說(shuō),每個(gè)對(duì)象可以用自己的方式去響應(yīng)同一消息(調(diào)用函數(shù))?!纠?-15】多態(tài)示例。任務(wù)三classPerson: #定義Person類def__init__(self,name):

#構(gòu)造方法,定義name=namedefwho(self): #定義who()方法print('我是一個(gè)人,我的名字是{}'.format())classStudent(Person):

#定義Student類,繼承Person類def__init__(self,n

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論