PYTHON程序設計 課件 【ch09】面向對象_第1頁
PYTHON程序設計 課件 【ch09】面向對象_第2頁
PYTHON程序設計 課件 【ch09】面向對象_第3頁
PYTHON程序設計 課件 【ch09】面向對象_第4頁
PYTHON程序設計 課件 【ch09】面向對象_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

面向對象“計算機類精品系列教材Python程序設計第九章01面向對象的概念一、面向對象的概念01面向對象編程的特點面向對象以“對象”為基本單元構建系統(tǒng),對象把數(shù)據(jù)和數(shù)據(jù)的操作方法封裝在一起,作為一個相互依存的整體。把同類的對象抽象出共性,形成類。類是對象的抽象,對象是類具體化的體現(xiàn)(類是大范圍的,一個類可以定義多個對象),對象與對象之間通過消息進行溝通,程序流程由用戶在使用中決定。面向對象的編程(ObjectOrientedProgramming,OOP)是一種不同于面向過程的編程思想。OOP把對象作為一個程序的基本單元,一個對象包含了數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)。面向對象的出現(xiàn)極大地提高了編程的效率,使得編程的重用性提高。一、面向對象的概念01面向對象編程的特點1.封裝性封裝是面向對象程序設計的核心思想,隱藏對象的屬性和行為,將它們封裝起來的載體就是類。相當于將不必要的數(shù)據(jù)和實現(xiàn)細節(jié)封裝起來,通過不同的訪問范圍對外暴露相關調(diào)用函數(shù)和數(shù)據(jù)。在使用面向對象的封裝特性時,需要注意以下兩點:(1)將屬性和函數(shù)封裝到類。(2)通過對象或類名調(diào)用被封裝的屬性和函數(shù),具體的調(diào)用方法包含以下幾種。1類外通過對象調(diào)用被封裝的屬性:對象.屬性名。②類內(nèi)、類外通過類名調(diào)用被封裝的類屬性:類名.類屬性名。③類內(nèi)通過self調(diào)用被封裝的屬性:self.屬性名。④類外通過對象調(diào)用被封裝的函數(shù):對象.函數(shù)名()。⑤類內(nèi)通過self調(diào)用被封裝的函數(shù):self.函數(shù)名()。⑥類內(nèi)、類外調(diào)用被封裝的類函數(shù)和靜態(tài)函數(shù):類名.函數(shù)名()。一、面向對象的概念01面向對象編程的特點2.繼承性類的繼承性,可以以人為例,每個人生下來都從父母那里繼承了一些特征,比如膚色,但是又和父母有所差別,每個人都有自己的一些新特征。Python中的類也有繼承性,一個類可以繼承另外一個類,其中,被繼承的類叫作父類或基類,繼承別的類的類叫作子類或派生類。類的繼承性是實現(xiàn)代碼復用的重要手段。3.多態(tài)性多態(tài)性按字面的意思就是指多種狀態(tài)。在面向對象編程中,接口的多種不同的實現(xiàn)方式即為多態(tài)。通俗來說,同一行為作用于不同類別的對象,可以有不同的解釋,產(chǎn)生不同的執(zhí)行結果。多態(tài)性的好處就是不同的子類既可以直接繼承父類的函數(shù),又可以重寫父類的函數(shù),從而使子類具有同名但不同實現(xiàn)方法的函數(shù)。一、面向對象的概念類是對對象的屬性和行為的一種封裝,是一種抽象化的概念。例如,不同大象之間是存在相同的屬性和行為的,如大象都具有身高、體重、耳朵、鼻子等,可以把這些共有的屬性和行為封裝為大象類,那么大象類就具有了身高、體重、鼻子等屬性和吃、睡等行為,草原上的每個大象都是大象類的一個實例對象。類是由屬性和行為兩部分構成的,如上述大象類中的身高、體重、耳朵、鼻子這些描述大象特征的,稱之為屬性,在定義對象后,可以通過對象為這些屬性賦值。上述大象類中的吃、睡是完成特定功能的行為,稱之為方法或函數(shù)。02

類一、面向對象的概念類是對象的抽象,對象是類的一個具體實例。對象具有類中的所有屬性和行為,同時這些屬性具有對應的值。例如,可以定義一個學生類,包含學號、姓名、性別等屬性和吃飯、睡覺、學習等方法,學生是一個類,是抽象的,不是特指哪個具體學生,當特指姓名為“張三”的一個具體學生時,這就是一個學生對象??梢哉f,世間萬物都是對象。對象通常被劃分為靜態(tài)部分和動態(tài)部分,以上面的學生類為例,吃飯、睡覺、學習等操作被稱為行為,屬于動態(tài)部分。學號、姓名、性別等用來描述一個學生的信息被稱為屬性,屬于靜態(tài)部分。03

對象02類與對象二、類與對象01類與對象的定義1.類的定義在Python中,定義類是由class關鍵字實現(xiàn)的,其語法格式如下。二、類與對象01類與對象的定義ClassName:表示要創(chuàng)建的類的名字,命名方法一般推薦使用駝峰式命名規(guī)則,即每個單詞的首字母大寫。statement:類主體主要由類變量、方法、屬性等定義類的語句組成。定義類的時候有3種(兩類)方式:新式類和兩種經(jīng)典類,上述定義類的語法結構中的最后一種為新式類定義方法,前兩種是經(jīng)典類定義方法。在新式類定義方法中,object是Python中所有的類的頂級父類。當沒有類繼承時,類名后面的括號可以加,也可以不加。類定義和函數(shù)定義一樣,只有在被執(zhí)行時才會起作用。代碼執(zhí)行到類定義語句時,會創(chuàng)建一個新的命名空間,并把它們叫作局部作用域,因此在類中定義的變量屬于局部變量。二、類與對象01類與對象的定義2.對象的定義在創(chuàng)建類后,通過創(chuàng)建該類的實例—―對象,去實現(xiàn)類中的各種操作。創(chuàng)建某個類的對象的語法格式如下。對象=類名()例如,定義一個Student類,并創(chuàng)建一個Student類的實例化對象,代碼如下。通過student1=Student()語句創(chuàng)建一個Student類的實例對象student1,之后,可以通過實例對象studentl來訪問Student類的屬性和方法。student1是一個對象,它擁有Student類中的屬性(數(shù)據(jù))和方法(函數(shù))。二、類與對象02

構造函數(shù)類的構造函數(shù)是在創(chuàng)建類實例對象時執(zhí)行的代碼,比如在創(chuàng)建對象時,給對象屬性傳遞初始值及為屬性設置默認值等初始化操作。類的構造函數(shù)為實例對象的創(chuàng)建提供了參數(shù)輸入,也為實例屬性的定義和賦值提供了支持。構造函數(shù)也叫構造器,是創(chuàng)建對象的時候第一個被自動調(diào)用的函數(shù)。在定義類時,通常需要創(chuàng)建一個_init_O函數(shù),該函數(shù)就是構造函數(shù)。該函數(shù)中的第一個參數(shù)self表示對象本身,是必須包含的,在創(chuàng)建對象時忽略該參數(shù)即可。定義構造函數(shù)的語法格式如下。def_init_(self,arg1,arg2,...):函數(shù)體self指的是實例本身,arg1,arg2...可以自定義,參數(shù)間用英文逗號“,”隔開。init的左右兩邊是兩個下畫線。構造函數(shù)的參數(shù)除self外,需要在定義對象時設定相應的參數(shù)值。二、類與對象02

構造函數(shù)下面定義一個Student類,并創(chuàng)建其構造函數(shù)。二、類與對象02

構造函數(shù)運行上述代碼的輸出結果如下。二、類與對象02

構造函數(shù)除此之外,構造函數(shù)中的參數(shù)也可以和前面講的函數(shù)一樣帶有默認值,帶有默認值的參數(shù)必須位于沒有默認值的參數(shù)后面。例如:二、類與對象02

構造函數(shù)運行上述代碼的輸出結果如下。二、類與對象03

成員屬性1.類成員屬性類成員屬性就是類變量,所有對象共用同一個值,不屬于某一個具體對象,可以通過類名或對象訪問。2.對象成員屬性對象成員屬性在類中是很常見的,通過“self.對象成員屬性=值”的方式定義對象成員屬性,對象成員屬性一般建議定義在構造函數(shù)中。對象成員屬性屬于每個獨立的對象,即不同的對象的成員屬性值可以不同,每個對象封裝屬于自己特有的數(shù)據(jù)。例如,上面代碼中Student類中的self.sid、、self.sex、self.grade都是Student類的對象成員屬性。在類內(nèi),對象成員屬性可以通過self在不同方法中訪問;在類外,可以通過“對象名.成員屬性名”的方式訪問。二、類與對象03

成員屬性3.成員屬性的保護在Python中,為了防止成員屬性被惡意訪問或篡改,可以對成員屬性進行封裝保護。Python通過下畫線對成員屬性進行保護,成員屬性的保護級別及訪問域如表9-1所示。二、類與對象03

成員屬性通過對成員屬性的封裝,可以充分保護成員屬性數(shù)據(jù)的安全。但是也帶來一個問題,當把成員屬性定義為私有屬性后,如何通過對象訪問或設置這些屬性的值呢﹖解決方法就是為每個屬性定義一個get方法和set方法。將Student類的對象成員屬性修改為對象私有成員屬性后的代碼如下。二、類與對象03

成員屬性二、類與對象03

成員屬性運行上述代碼的輸出結果如下。經(jīng)過上述修改后,通過對象只能讀取_sid對象成員屬性而無法直接修改_sid對象成員屬性,達到了防止_sid對象成員屬性被惡意修改的效果。二、類與對象03

成員方法1.對象成員方法對象成員方法是通過類的對象實例來訪問的方法,其語法格式如下。deffunctionName(self,parameterlist):block對象成員方法的參數(shù)說明如下。functionName:用于指定方法名,一般以小寫字母開頭。self:必要參數(shù),表示類的實例,通過此參數(shù)可以在方法內(nèi)訪問類的對象成員屬性和其他對象成員方法。parameterlist:用于指定除self參數(shù)之外的參數(shù),參數(shù)之間用英文逗號“,”隔開。block:實現(xiàn)此方法的語句塊,用來實現(xiàn)具體功能。對象成員方法和Python函數(shù)的主要區(qū)別在于,函數(shù)是一個獨立的功能,而對象成員方法代表類中的一個行為。對象成員方法可以通過“對象名.functionName(參數(shù))”的方式來訪問,如前面代碼中的student1.out()語句。二、類與對象03

成員方法2.屬性成員的方法這里的屬性與前面的類成員屬性和對象成員屬性不同,這里的屬性是一種特殊的對象成員屬性,當訪問它時將調(diào)用一個方法并將返回值作為該成員屬性的值。實質(zhì)上就是通過訪問對象成員屬性的方式訪問成員方法。在Python中,可以通過@property裝飾器將一個對象成員方法轉換為對象成員屬性,實現(xiàn)用于計算的對象成員屬性,轉換為對象成員屬性后,可以直接通過方法名訪問對象成員方法,不用再填上圓括號(),其語法格式如下。二、類與對象03

成員方法其中的參數(shù)含義如下。methodname:方法名。self:必要參數(shù),代表對象本身。block:方法的實現(xiàn)語句塊,實現(xiàn)具體功能,以return語句結束,用來返回計算結果。例如,定義一個矩形類,首先定義兩個實例屬性,然后定義計算面積的方法,并應用@property裝飾器將其轉換為對象成員屬性,最后創(chuàng)建實例化對象,訪問轉換后的對象成員屬性。二、類與對象03

成員方法3.類成員的方法類成員方法是通過類來訪問的方法,在類成員方法中,可以訪問類成員屬性和類成員方法,不能訪問對象成員屬性和對象成員方法。類成員方法的語法格式如下。其中的參數(shù)含義如下。@classmethod:類成員方法修飾器,表明下面的方法是類成員方法。methodName:類成員方法名。cls:代表類本身,和self參數(shù)類似,調(diào)用時不需要考慮該參數(shù)。parameters_list:參數(shù)列表,根據(jù)實際需要定義的參數(shù)。methodblock:實現(xiàn)類成員方法的具體實現(xiàn)語句。二、類與對象03

成員方法3.靜態(tài)成員的方法靜態(tài)成員方法用于實現(xiàn)跟類有關的功能計算,但是在運行時不需要對象和類參與的情況,如更改環(huán)境變量或修改其他類的成員屬性等。在通過類調(diào)用時,靜態(tài)成員方法與類成員方法對調(diào)用者來說是不可區(qū)分的。靜態(tài)成員方法的語法格式如下。其中的參數(shù)含義如下。@staticmethod:靜態(tài)成員方法的修飾器,表明下面的方法是靜態(tài)成員方法。methodName:靜態(tài)成員方法名稱。parameters_list:參數(shù)列表。methodblock:實現(xiàn)靜態(tài)成員方法的語句塊。03繼承三、繼承01

子類定義繼承是面向對象編程的重要特性之一。面向對象中的繼承表示該類擁有被繼承類的所有公有和受保護成員,被繼承的類叫作基類或父類,而新的類被稱為派生類或子類。類繼承的語法格式如下。ClassName:子類的名稱。baseclass:要繼承的父類,可以有多個,類名之間用英文逗號“,”隔開。如果不指定,則默認為object類。classstatement:表示類的實現(xiàn)代碼,包括類屬性和方法。三、繼承01

子類定義例如:三、繼承01

子類定義三、繼承01

子類定義在上面的代碼中,父類Person類的out()對象成員方法被子類Student類和Teacher類繼承。在子類中不必重寫此代碼,直接使用就可以。但是,父類Person類中的name、age和sex對象成員屬性,在子類中又被重復定義,有沒有簡單的方法使得在子類Student類和Teacher類中不再定義這些對象成員屬性呢?在Python中,通過super()函數(shù)可以解決上面的問題,通過super()函數(shù)可以訪問父類的成員屬性和成員方法,可以通過super()._init_()函數(shù)調(diào)用父類的構造函數(shù)。經(jīng)過修改后的代碼如下。三、繼承01

子類定義三、繼承01

子類定義從上面的代碼可以看出,父類Person類中的name、age和sex對象成員屬性,以及out()對象成員方法都被子類Student類和Teacher類繼承。除此之外,Student類還有自己的sid和grade對象成員屬性,Teacher類還有自己的tid和title對象成員屬性。需要注意的是,父類中只有公有的和受保護的對象成員屬性和成員方法才能被子類繼承,私有的對象成員屬性和成員方法是無法被子類繼承的。例如:三、繼承01

子類定義如果想讓子類Student類繼承父類Person類中的classId對象成員屬性,可以使用以下兩種方法。(1)將父類Person類中的self._classId=1修改為self._classId=1,即將classId改為受保護類型,同時把子類Student類中的self.classId=self._classld修改為self.classId=self._classId。(2)將父類Person類中的self._classId=1語句修改為self.classId=1,即將classId改為公有類型,同時把子類Student類中的self.classId=self._classId刪除。三、繼承02

方法重寫在面向對象的程序設計中需要類繼承時,存在父類中的某個方法不適合子類的情況時,需要在子類中重新定義父類的同名方法,稱之為重寫。在子類重寫父類方法時,有以下兩種情況。(1)覆蓋父類的方法:父類的方法實現(xiàn)和子類的方法實現(xiàn)完全不同,就可以使用覆蓋的方式在子類中重新編寫父類的方法實現(xiàn)。具體的實現(xiàn)方式相當于在子類中定義一個和父類同名的方法并且實現(xiàn),重寫后運行時只會調(diào)用子類中重寫的方法,不會再調(diào)用父類封裝的方法。(2)對父類的方法進行擴展:子類的方法實現(xiàn)包含父類的方法實現(xiàn),父類原本封裝的方法實現(xiàn)是子類方法的一部分,就可以使用擴展的方式,在子類中重寫父類的方法,在需要的位置使用“super().父類方法”來調(diào)用父類方法的執(zhí)行,代碼中其他的位置針對子類的需求,編寫子類特有的代碼實現(xiàn)。在Python中,super是一個特殊的類,super()的含義是創(chuàng)建一個super類對象,最常使用的場景是在重寫父類方法時,調(diào)用在父類中封裝的方法實現(xiàn)。三、繼承02

方法重寫例如,將父類Person類的out()對象成員方法在子類Student類中覆蓋重寫。三、繼承02

方法重寫三、繼承02

方法重寫運行上述代碼的輸出結果如下。三、繼承02

方法重寫由上面代碼可以看出,父類P

溫馨提示

  • 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

提交評論