PYTHON程序設(shè)計(jì) 課件 【ch09】面向?qū)ο骭第1頁
PYTHON程序設(shè)計(jì) 課件 【ch09】面向?qū)ο骭第2頁
PYTHON程序設(shè)計(jì) 課件 【ch09】面向?qū)ο骭第3頁
PYTHON程序設(shè)計(jì) 課件 【ch09】面向?qū)ο骭第4頁
PYTHON程序設(shè)計(jì) 課件 【ch09】面向?qū)ο骭第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

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

類一、面向?qū)ο蟮母拍铑愂菍?duì)象的抽象,對(duì)象是類的一個(gè)具體實(shí)例。對(duì)象具有類中的所有屬性和行為,同時(shí)這些屬性具有對(duì)應(yīng)的值。例如,可以定義一個(gè)學(xué)生類,包含學(xué)號(hào)、姓名、性別等屬性和吃飯、睡覺、學(xué)習(xí)等方法,學(xué)生是一個(gè)類,是抽象的,不是特指哪個(gè)具體學(xué)生,當(dāng)特指姓名為“張三”的一個(gè)具體學(xué)生時(shí),這就是一個(gè)學(xué)生對(duì)象??梢哉f,世間萬物都是對(duì)象。對(duì)象通常被劃分為靜態(tài)部分和動(dòng)態(tài)部分,以上面的學(xué)生類為例,吃飯、睡覺、學(xué)習(xí)等操作被稱為行為,屬于動(dòng)態(tài)部分。學(xué)號(hào)、姓名、性別等用來描述一個(gè)學(xué)生的信息被稱為屬性,屬于靜態(tài)部分。03

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

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

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

構(gòu)造函數(shù)運(yùn)行上述代碼的輸出結(jié)果如下。二、類與對(duì)象02

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

構(gòu)造函數(shù)運(yùn)行上述代碼的輸出結(jié)果如下。二、類與對(duì)象03

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

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

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

成員屬性二、類與對(duì)象03

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

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

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

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

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

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

子類定義繼承是面向?qū)ο缶幊痰闹匾匦灾?。面向?qū)ο笾械睦^承表示該類擁有被繼承類的所有公有和受保護(hù)成員,被繼承的類叫作基類或父類,而新的類被稱為派生類或子類。類繼承的語法格式如下。ClassName:子類的名稱。baseclass:要繼承的父類,可以有多個(gè),類名之間用英文逗號(hào)“,”隔開。如果不指定,則默認(rèn)為object類。classstatement:表示類的實(shí)現(xiàn)代碼,包括類屬性和方法。三、繼承01

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

子類定義三、繼承01

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

子類定義三、繼承01

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

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

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

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

方法重寫三、繼承02

方法重寫運(yùn)行上述代碼的輸出結(jié)果如下。三、繼承02

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論