Python程序設計 課件 第五章 面向?qū)ο骭第1頁
Python程序設計 課件 第五章 面向?qū)ο骭第2頁
Python程序設計 課件 第五章 面向?qū)ο骭第3頁
Python程序設計 課件 第五章 面向?qū)ο骭第4頁
Python程序設計 課件 第五章 面向?qū)ο骭第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第五章面向?qū)ο驪ython程序設計01面向?qū)ο蠛喗?2類與對象03類的繼承與組合04本章回顧01面向?qū)ο竺嫦驅(qū)ο螅∣bjectOriented)是一種編程思想,是基于面向過程的編程思想慢慢發(fā)展而來的。面向?qū)ο笈c面向過程面向過程就是分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步實現(xiàn),使用的時候依次調(diào)用就可以了。而面向?qū)ο笫前褬嫵蓡栴}的事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為,面向?qū)ο笫且环N“自下而上”的設計語言,先設計組件,再完成拼裝。面向?qū)ο笙噍^于面向過程有更強的靈活性和擴展性。面向過程與面向?qū)ο笈e例以剪刀石頭布游戲為例來理解面向過程和面向?qū)ο笏枷氲膮^(qū)別,面向過程的設計思路就是按照步驟來實現(xiàn):①開始游戲。②玩家1出剪刀或石頭或布。③玩家2出剪刀或石頭或布。④根據(jù)玩家出的結果判斷輸贏。⑤重復步驟2、3、4,直到退出游戲。面向?qū)ο蟮脑O計則是從另外的思路來解決問題,整個游戲中玩家1和玩家2屬性和行為一致,可以用玩家類表示,判斷輸贏可以用游戲規(guī)則類表示,程序的實現(xiàn)步驟如下:①使用玩家類接收用戶輸入并將輸入結果傳遞給游戲規(guī)則類。②利用游戲規(guī)則類中的方法對輸贏進行判定。從上面的案例可以看出,針對同一個問題,面向過程和面向?qū)ο蠼鉀Q問題的思路有很大差異,從面向過程到面向?qū)ο?,不僅僅是編程方式的改變,更重要的是思考方式的改變。面向過程與面向?qū)ο髤^(qū)別面向過程更注重步驟與過程,不注重職責與分工,在開發(fā)簡單系統(tǒng)可行,但面對復雜大型系統(tǒng)時代碼會冗雜。面向?qū)ο笞⒅芈氊熍c分工,完成需求前先確定職責,再根據(jù)職責確定對象并封裝方法,最后根據(jù)業(yè)務需求讓不同對象調(diào)用不同方法。同時提到有面向過程和面向?qū)ο髤^(qū)別的總結表(下表)。面向?qū)ο蠡靖拍顚W習面向?qū)ο缶幊绦柘攘私庀嚓P概念。1.對象:在Python中一切皆為對象,如人、雞、花等都可表示為對象,具有唯一性,有屬性和行為,屬性是靜態(tài)部分如人的名字、性別等,行為是動態(tài)部分如吃飯、睡覺、工作等。2.類:是具有相同屬性和方法的對象的集合,是對象的模板,可對共有的屬性和方法進行定義,如狗的類有嘴、眼睛、腿等屬性和睡覺、吃東西、搖尾巴等行為,鄰居家小狗是該類的一個對象。3.實例化:創(chuàng)建類的實例即生成具體對象,如“狗”是類,自己養(yǎng)的寵物狗XX是實例化后的實例對象。類和對象的關系類和對象的關系可總結為以下幾點:①類是對象的模板,對象是類的具體實例。②類是抽象的,對象是具體的。③每一個對象都是某個類的實例。面向?qū)ο蟪绦蛟O計的特點面向?qū)ο蟪绦蛟O計有封裝、繼承、多態(tài)三大特點。

封裝:是面向?qū)ο缶幊毯诵乃枷耄芽陀^事物封裝成類,可將相同屬性和行為的對象封裝成類并隱藏不必要信息,確保類內(nèi)部數(shù)據(jù)完整。優(yōu)點包括減少耦合、可自由修改類內(nèi)部結構、保護成員屬性、隱藏信息實現(xiàn)細節(jié)。

繼承:是面向?qū)ο蟪绦蛟O計基石,實現(xiàn)代碼復用。子類繼承父類特征和行為,可定義自己的屬性和方法。優(yōu)點有提高類代碼復用性、可維護性,使類之間產(chǎn)生關系且是多態(tài)前提。

多態(tài):允許不同類對象對同一消息有不同響應,通過動態(tài)綁定實現(xiàn),同一操作作用不同對象有不同結果。存在條件為繼承、子類重寫父類方法、父類引用變量指向子類對象。02類與對象在生活中先有對象再有類,而在程序中是先有類才能有對象。在Python中,類的定義使用class關鍵字實現(xiàn),其語法格式如下:參數(shù)說明如下表所示。類的定義類的定義舉例如下圖所示。類的定義類在定義時可以為其添加說明文檔,說明文檔放在字符串中,通常位于類內(nèi)部、所有代碼的最前面,可以通過內(nèi)置的help()函數(shù)或__doc__屬性獲取說明文檔的內(nèi)容(和函數(shù)的說明文檔類似),如右圖所示。類的實例化類定義好之后,相當于有了一個模板,但沒有對象。對象的生成是通過類的實例化實現(xiàn)的,類的實例化語法如下:其中ClassName為類名,parameterlist為參數(shù)列表,類實例化時ClassName是必須指定的,是否有parameterlist要結合__init__()方法中的參數(shù)情況。創(chuàng)建__init__()方法__init__()方法類似于Java語言中的構造方法,在類實例化時會自動調(diào)用。__init__()方法必須包含一個self參數(shù),且必須是第一個參數(shù),如果沒有指定self參數(shù)的話,實例化時會報錯,如圖5-2所示。創(chuàng)建__init__()方法self參數(shù)是一個指向?qū)嵗旧淼囊?,用于訪問類中的屬性和方法。當__init__()方法中只有一個self參數(shù)時,實例化時不需要指定參數(shù),因為調(diào)用__init__()方法時會自動傳遞self參數(shù),如圖5-3所示。創(chuàng)建__init__()方法在__init__()方法中,除了可以指定self參數(shù),還可以自定義一些其它參數(shù),舉例如【代碼5-2】所示。創(chuàng)建__init__()方法【代碼5-2】的運行結果如圖5-4所示。類的屬性屬性是在類中定義的變量,有時也稱為特征,即類中客觀存在的靜態(tài)部分。根據(jù)屬性定義的位置不同,可分為類屬性和實例屬性。類屬性與實例屬性類屬性是在類中方法之外定義的屬性,實例屬性是定義在類的方法中的屬性,類屬性可以在類的所有實例之間共享值,實例屬性只作用于當前實例中。在右圖中,類中方法外定義的屬性grade為類屬性,__init__()方法中定義的屬性name、sex和age為實例屬性。類屬性與實例屬性類屬性可以通過類名或?qū)ο螅▽嵗┟L問,類屬性需通過類名來修改,類屬性修改后會作用于該類的所有實例中,如右圖所示。類屬性與實例屬性實例屬性只能通過對象名訪問,使用類名訪問會報錯,如下圖所示。類屬性與實例屬性·實例屬性可以通過對象名修改,修改一個對象的實例屬性并不影響其它對象中的實例屬性,如下圖所示。屬性的訪問權限類的屬性根據(jù)外部對其訪問的權限,分為共有屬性、保護屬性和私有屬性,總結如下表所示。屬性的訪問權限接下來我們定義一個Person類來舉例說明,如右圖所示。屬性的訪問權限在上頁代碼中,name是公有屬性,age是保護屬性,可以直接通過對象名訪問,如右圖所示。屬性的訪問權限height和weight是私有屬性,需通過“實例名._類名__XX”方式訪問,直接通過對象名訪問會報錯,如下圖所示。屬性的訪問權限在實際開發(fā)過程中,為了避免客戶端直接對屬性進行修改,我們一般將屬性設置為私有,然后通過set方法設置值,通過get方法獲取值,如右圖所示。類的方法在5.2.1中,我們接觸過類的方法,即__init__()方法。這個方法用來初始化一個對象,在實例化時自動執(zhí)行,如果一個類中沒有提供__init__()方法,Python將提供一個默認的__init__()方法。實例方法init__()方法在類內(nèi)部有特殊的功能,屬于特殊方法,除此之外,我們也可以在類中自定義其它的方法,該方法是一種在類的實例上操作的函數(shù),所以叫做實例方法。實例方法的第一個參數(shù)必須是self,其語法格式如下:實例方法其中functionName為方法名,一般使用小駝峰法命名,self用來表示類的實例,parameterlist用于指定self以外的其它參數(shù),block是用于實現(xiàn)具體功能的方法體。關于實例方法的使用舉例如右圖所示。實例方法實例方法的訪問權限實例方法的訪問權限與類屬性的訪問權限類似,可分為公有方法、保護方法和私有方法。實例方法的訪問權限總結如下圖所示。實例方法的訪問權限接下來我們改造之前的Person類,分別定義公有方法、保護方法和私有方法,如右圖所示。實例方法的訪問權限類的實例化之后,公有方法可以直接訪問,如下圖所示。實例方法的訪問權限保護方法通過單下劃線訪問,如右圖所示。私有方法不能在類外部訪問,不然會報錯,如右圖所示。實例方法的訪問權限在公有方法judge_BMI()中使用代碼“BMI=self.__get_BMI2()”訪問了私有方法,調(diào)用judge_BMI()方法的運行結果如下圖所示。類方法類方法使用裝飾器“@classmethod”修飾,類方法的第一個參數(shù)必須是當前類對象(一般約定為“cls”),通過這個參數(shù)來傳遞類的屬性和方法,類和實例對象都可以調(diào)用類方法。類方法的使用舉例如右圖所示。類方法運行結果如下圖所示。類方法需要注意的是類方法中一定要有cls參數(shù),如果不提供參數(shù)的話會報錯,如右圖所示。靜態(tài)方法(2)靜態(tài)方法靜態(tài)方法使用裝飾器“@staticmethod”修飾,靜態(tài)方法與普通方法類似,不需要有self參數(shù)和cls參數(shù),一個類中的所有實例共享靜態(tài)方法,類和實例對象都可以調(diào)用靜態(tài)方法。我們將上頁代碼中的類方法修改成靜態(tài)方法,如右圖所示。靜態(tài)方法運行結果如下圖所示。03類的繼承與組合繼承是實現(xiàn)代碼重用的重要手段,當要編寫的類和之前已經(jīng)使用過的類有很多屬性和方法是相同的,且存在一定的繼承關系時,即可使用繼承這種方式來達到代碼重用的目的。如之前使用過的Person類和Student類,Student類就可以繼承自Person類。父類與子類學習繼承需先了解父類和子類概念。在Python中,Object類是所有類的父類。繼承特性源于生活,如每個人從人類祖先繼承說話、走路等行為,從父輩繼承相貌、身高等特征,同時每個人也有獨特的特征和行為。在Python中,父類和子類的關系可總結如下:子類繼承父類的屬性和方法。子類可以在父類的基礎上額外添加屬性和方法。子類可以重寫父類的方法。一個子類可以有多個父類,即多重繼承。繼承的語法Python中繼承的語法格式如下:參數(shù)說明如下圖所示。繼承的語法接下來我們定義一個Animal類做為父類,Dog類和Cat類分別繼承Animal類,如右圖所示。繼承的語法運行結果如下圖所示。方法重寫子類會繼承父類的方法,當父類中的某個方法不適用于子類時,子類可以對其進行重寫。需要注意的是當子類重寫父類的__init__方法時,如果需要父類的構造方法時需使用super關鍵字顯式地調(diào)用,如果子類不重寫__init__方法,實例化子類時,會自動調(diào)用父類定義的__init__方法。方法重寫右圖中,子類Dog沒有重寫父類的__init__方法,實例化時自動調(diào)用了父類的__init__方法。當子類重寫了__init__方法,但是不需要父類的構造方法時,子類被實例化時直接調(diào)用子類重寫后的__init__方法,如右圖所示。方法重寫方法重寫的使用舉例如右圖所示。方法重寫方法重寫運行結果如下圖所示。方法重寫從上頁及其運行結果可總結出:

1.子類Dog重寫了__init__()方法和personality()方法,重寫__init__()時通過“super().init(name,shout)”顯式調(diào)用父類的__init__()方法。

2.子類Cat重寫了personality()方法,未重寫__init__()方法,實例化時自動調(diào)用父類__init__()方法。

3.實例化對象dog和cat都調(diào)用了父類定義的info()方法和各自重寫后的personality()方法,返回結果不同。類的組合代碼重用除繼承方式外還有類的組合,即在一個類中以另一個類的對象作為數(shù)據(jù)屬性。當類之間差異顯著且一個大類由多個小類組成時可使用組合。例如電腦有品牌、顏色、內(nèi)存等信息,可分為基本信息、硬件、操作系統(tǒng)三類,計算機這個大類可看成由這些小類的對象組成,如右圖所示。類的組合類的組合運行結果如右圖所示。在實際開發(fā)過程中,我們可以結合業(yè)務需求,將繼承、組合兩種方式結合使用。案例【案例描述】馬戲團,是進行馬戲表演的團體組織。它起源于非常血腥殘酷的古羅馬角斗士斗獸場。當時有“只有面包和馬戲”才能使羅馬人快樂的說法。在英文里,馬戲團叫做“Circus”,源自拉丁文“圓圈”的意思,指圓形露天競技場?,F(xiàn)代的馬戲團也在圓形場地中演出,因此演變成“馬戲團”的意思。馬戲的主要內(nèi)容是動物表演,之所以被稱為“馬戲”,是因為最早的表演的主角是馬,以后才陸續(xù)出現(xiàn)其它的動物演員?!景咐蟆勘景咐M馬戲團運行流程,按照菜單選擇查看動物基本信息(本馬戲團中動物演員包括但不限于海豚、猴子、獅子等)、隨機觀看表演、順序觀看表演等。案例本章回顧1.【多選】關于面向?qū)ο竺枋稣_的有()。A.面向?qū)ο螅∣bjectOriented)是一種編程思想,是基于面向過程的編程思想慢慢發(fā)展而來的B.面向?qū)ο笫前褬嫵蓡栴}的事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為C.面向?qū)ο笫且环N“自下而上”的設計語言,先設計組件,再完成拼裝D.面向?qū)ο筮m用于簡單系統(tǒng),容易理解2.【多選】關于面向過程描述正確的有()。A.面向過程就是分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步實現(xiàn),使用的時候依次調(diào)用就可以了B.面向過程是以過程/方法為中心來組織編程方式C.面向過程難以應對復雜系統(tǒng),難以復用,不易維護、不易擴展D.面向過程更注重的是步驟與過程,不注重職責與分工綜合練習3.【多選】關于類和對象的關系描述正確的有()。A.類是用來描述具有相同的屬性和方法的對象的集合B.類是對象的模板,對象是類的具體實例C.實例化就是創(chuàng)建一個類的實例,也就是生成類的具體對象D.類是抽象的,對象是具體的4.【多選】關于面向?qū)ο蟪绦蛟O計的特點,描述正確的有()。A.封裝是面向?qū)ο缶幊痰暮诵乃枷隑.繼承是實現(xiàn)代碼復用的重要手段C.多態(tài)指允許不同類的對象對同一消息做出響應,即同一消息可以根據(jù)發(fā)送對象的不同而采用多種不同的行為方式D.繼承可以提高代碼的復用性和可維護性綜合練習5.【多選】關于類屬性與實例屬性描述正確的有()。A.類屬性是在類中方法之外定義的屬性,實例屬性是定義在類的方法中的屬性B.類的所有實例之間不可以共享類屬性的值C.類屬性可以通過類名或?qū)ο螅▽嵗┟L問D.實例屬性只能通過對象名訪問6.【多選】關于類屬性的訪問權限描述正確的有()。A.沒有以任何下劃線開頭的屬性是公有屬性,可在類的外部直接訪問B.以單下劃線“_”開頭的屬性是保護屬性,只有其本身和子類能訪問C.以雙下劃線“__”開頭的屬性是私有屬性,只有該類本身可以訪問,子類不能訪問D.私有屬性不能通過類的實例直接訪問,需通過“實例名._XX”來訪問綜合練習7.定義類的關鍵字是()。A.function B.def

C.classD.define8.關于__init__()方法描述錯誤的是()。A.__init__()方法類似于Java語言中的構造方法,在類實例化時會自動調(diào)用B._

溫馨提示

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

評論

0/150

提交評論