Python語(yǔ)言程序設(shè)計(jì)(第2版) 課件 第9章 面向?qū)ο蟪绦蛟O(shè)計(jì)_第1頁(yè)
Python語(yǔ)言程序設(shè)計(jì)(第2版) 課件 第9章 面向?qū)ο蟪绦蛟O(shè)計(jì)_第2頁(yè)
Python語(yǔ)言程序設(shè)計(jì)(第2版) 課件 第9章 面向?qū)ο蟪绦蛟O(shè)計(jì)_第3頁(yè)
Python語(yǔ)言程序設(shè)計(jì)(第2版) 課件 第9章 面向?qū)ο蟪绦蛟O(shè)計(jì)_第4頁(yè)
Python語(yǔ)言程序設(shè)計(jì)(第2版) 課件 第9章 面向?qū)ο蟪绦蛟O(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩32頁(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)介

第9章面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)概述類與對(duì)象屬性和方法繼承和多態(tài)面向?qū)ο蟪绦蛟O(shè)計(jì)應(yīng)用舉例9.1.1面向?qū)ο蟮幕靖拍?.對(duì)象現(xiàn)實(shí)世界中客觀存在的事物稱作對(duì)象(object),任何對(duì)象都具有各自的特征(屬性)和行為(方法)。面向?qū)ο蟪绦蛟O(shè)計(jì)中的對(duì)象是現(xiàn)實(shí)世界中的客觀事物在程序設(shè)計(jì)中的具體體現(xiàn),它也具有自己的特征和行為。對(duì)象的特征用數(shù)據(jù)來(lái)表示,稱為屬性(property)。對(duì)象的行為用程序代碼來(lái)實(shí)現(xiàn),稱為對(duì)象的方法(method)。總之,任何對(duì)象都是由屬性和方法組成的。9.1面向?qū)ο蟪绦蛟O(shè)計(jì)概述2.類類(class)是具有相同屬性和行為的一組對(duì)象的集合,它為屬于該類的全部對(duì)象提供了統(tǒng)一的抽象描述。任何對(duì)象都是某個(gè)類的實(shí)例(instance)。在系統(tǒng)中通常有很多相似的對(duì)象,它們具有相同名稱和類型的屬性、響應(yīng)相同的消息、使用相同的方法。將相似的對(duì)象分組形成一個(gè)類,每個(gè)這樣的對(duì)象被稱為類的一個(gè)實(shí)例,一個(gè)類中的所有對(duì)象共享一個(gè)公共的定義,盡管它們對(duì)屬性所賦予的值不同。3.消息一個(gè)系統(tǒng)由若干個(gè)對(duì)象組成,各個(gè)對(duì)象之間通過(guò)消息(message)相互聯(lián)系、相互作用。消息是一個(gè)對(duì)象要求另一個(gè)對(duì)象實(shí)施某項(xiàng)操作的請(qǐng)求。發(fā)送者發(fā)送消息,在一條消息中,需要包含消息的接收者和要求接收者執(zhí)行某項(xiàng)操作的請(qǐng)求,接收者通過(guò)調(diào)用相應(yīng)的方法響應(yīng)消息,這個(gè)過(guò)程被不斷地重復(fù),從而驅(qū)動(dòng)整個(gè)程序的運(yùn)行。4.封裝封裝(encapsulation)是指把對(duì)象的數(shù)據(jù)(屬性)和操作數(shù)據(jù)的過(guò)程(方法)結(jié)合在一起,構(gòu)成獨(dú)立的單元,它的內(nèi)部信息對(duì)外界是隱蔽的,不允許外界直接存取對(duì)象的屬性,只能通過(guò)使用類提供的外部接口對(duì)該對(duì)象實(shí)施各項(xiàng)操作,保證了程序中數(shù)據(jù)的安全性。類是數(shù)據(jù)封裝的工具,對(duì)象是封裝的實(shí)現(xiàn)。類的訪問(wèn)控制機(jī)制體現(xiàn)在類的成員中可以有公有成員、私有成員和保護(hù)成員。對(duì)于外界而言,只需要知道對(duì)象所表現(xiàn)的外部行為,而不必了解內(nèi)部實(shí)現(xiàn)細(xì)節(jié)。5.繼承繼承(inheritance)反映的是類與類之間抽象級(jí)別的不同,根據(jù)繼承與被繼承的關(guān)系,可分為基類和衍類,基類也稱為父類,衍類也稱為子類,正如“繼承”這個(gè)詞的字面含義一樣,子類將從父類那里獲得所有的屬性和方法,并且可以對(duì)這些獲得的屬性和方法加以改造,使之具有自己的特點(diǎn)。6.多態(tài)多態(tài)(polymorphism)是指同一名字的方法產(chǎn)生了多個(gè)不同的動(dòng)作行為,也就是不同的對(duì)象收到相同的消息時(shí)產(chǎn)生不同的行為方式。將多態(tài)的概念應(yīng)用于面向?qū)ο蟪绦蛟O(shè)計(jì),增強(qiáng)了程序?qū)陀^世界的模擬性,使得對(duì)象程序具有了更好的可讀性,更易于理解,而且顯著提高了軟件的可復(fù)用性和可擴(kuò)充性。9.1.2從面向過(guò)程到面向?qū)ο竺嫦蜻^(guò)程程序設(shè)計(jì)就是采用自頂向下的方法,分析出解決問(wèn)題所需要的步驟,將程序分解為若干個(gè)功能模塊,每個(gè)功能模塊用函數(shù)來(lái)實(shí)現(xiàn)。一個(gè)面向?qū)ο蟮某绦蛞话阌深惖穆暶骱皖惖氖褂脙刹糠纸M成。程序設(shè)計(jì)始終圍繞“類”展開(kāi)。通過(guò)聲明類,構(gòu)建了程序所要完成的功能,體現(xiàn)了面向?qū)ο蟪绦蛟O(shè)計(jì)的思想。在Python中,所有數(shù)據(jù)類型都可以視為對(duì)象,當(dāng)然也可以自定義對(duì)象。自定義的對(duì)象數(shù)據(jù)類型就是面向?qū)ο笾械念惖母拍睢?.2.1類的定義在Python中,通過(guò)class關(guān)鍵字來(lái)定義類。定義類的一般格式如下:class類名:類體例如定義了一個(gè)Person類:classPerson:name='brenden'#定義了一個(gè)屬性defprintName(self):#定義了一個(gè)方法print()9.2類與對(duì)象9.2.2對(duì)象的創(chuàng)建和使用在Python中,用賦值的方式創(chuàng)建類的實(shí)例,一般格式為:對(duì)象名=類名(參數(shù)列表)創(chuàng)建對(duì)象后,可以使用“.”運(yùn)算符,通過(guò)實(shí)例對(duì)象來(lái)訪問(wèn)這個(gè)類的屬性和方法(函數(shù)),一般格式為:對(duì)象名.屬性名對(duì)象名.函數(shù)名()例如,語(yǔ)句“p=Person()”產(chǎn)生了一個(gè)Person的實(shí)例對(duì)象,此時(shí)可以用來(lái)調(diào)用類的name屬性。例9-1類和對(duì)象應(yīng)用示例。classCC:x=10#定義屬性y=20#定義屬性z=30#定義屬性defshow(self):#定義方法print((self.x+self.y+self.z)/3)b=CC()#創(chuàng)建實(shí)例對(duì)象bb.x=30#調(diào)用屬性xb.show()#調(diào)用方法show程序輸出結(jié)果如下:26.6666666666666689.3.1屬性和方法的訪問(wèn)控制1.屬性的訪問(wèn)控制在Python中沒(méi)有像C++中public和private這些關(guān)鍵字來(lái)區(qū)別公有屬性和私有屬性,它是以屬性命名方式來(lái)區(qū)分,如果在屬性名前面加了兩個(gè)下劃線“__”,則表明該屬性是私有屬性,否則為公有屬性。方法也一樣,如果在方法名前面加了2個(gè)下劃線,則表示該方法是私有的,否則為公有的。9.3屬性和方法例如:classPerson:name='brenden'age=18p=Person()print(,p.age)這里的name和age都是公有的,可以直接在類外通過(guò)對(duì)象名訪問(wèn),如果想定義成私有的,則需在前面加2個(gè)下劃線“__”。2.方法的訪問(wèn)控制在類中可以根據(jù)需要定義一些方法,定義方法采用def關(guān)鍵字,在類中定義的方法至少會(huì)有一個(gè)參數(shù),,一般以名為“self”的變量作為該參數(shù)(用其他名稱也可以),而且需要作為第一個(gè)參數(shù)。下面看一個(gè)例子。例9-2方法的訪問(wèn)控制使用示例。程序如下:classPerson:__name='brenden'__age=18defgetName(self):returnself.__namedefgetAge(self):returnself.__agep=Person()print(p.getName(),p.getAge())程序輸出結(jié)果如下:brenden189.3.2類屬性和實(shí)例屬性1.類屬性顧名思義,類屬性(classattribute)就是類對(duì)象所擁有的屬性,它被所有類對(duì)象的實(shí)例對(duì)象所共有,在內(nèi)存中只存在一個(gè)副本。對(duì)于公有的類屬性,在類外可以通過(guò)類對(duì)象和實(shí)例對(duì)象訪問(wèn)。

例如:classPerson:name='brenden'#公有的類屬性__age=18#私有的類屬性p=Person()print()#正確,但不提倡print(P)#正確print(p.__age)#錯(cuò)誤,不能在類外通過(guò)實(shí)例對(duì)象訪問(wèn)私有的類屬性print(Person.__age)#錯(cuò)誤,不能在類外通過(guò)類對(duì)象訪問(wèn)私有的類屬性2.實(shí)例屬性實(shí)例屬性(instanceattribute)是不需要在類中顯式定義,而在__init__構(gòu)造函數(shù)中定義的,定義時(shí)以self作為前綴。在其他方法中也可以隨意添加新的實(shí)例屬性,但并不提倡這么做,所有的實(shí)例屬性最好在__init__中給出。實(shí)例屬性屬于實(shí)例(對(duì)象),只能通過(guò)對(duì)象名訪問(wèn)。例如:>>>classCar:def__init__(self,c):self.color=c#定義實(shí)例對(duì)象屬性deffun(self):self.length=1.83#給實(shí)例添加屬性,但不提倡>>>s=Car('Red')>>>print(s.color)Red>>>s.fun()>>>print(s.length)1.839.3.3類的方法1.類中類中最常用的內(nèi)置方法就是構(gòu)造方法和析構(gòu)方法。1)構(gòu)造方法構(gòu)造方法__init__(self,……)在生成對(duì)象時(shí)調(diào)用,可以用來(lái)進(jìn)行一些屬性初始化操作,不需要顯式去調(diào)用,系統(tǒng)會(huì)默認(rèn)去執(zhí)行。構(gòu)造方法支持重載,如果用戶自己沒(méi)有重新定義構(gòu)造方法,系統(tǒng)就自動(dòng)執(zhí)行默認(rèn)的構(gòu)造方法。看下面的程序。例9-3構(gòu)造方法使用示例。程序如下:classPerson:def__init__(self,name):self.PersonName=namedefsayHi(self):print('Hello,mynameis{}.'.format(self.PersonName))p=Person('Jasmine')p.sayHi()程序輸出結(jié)果如下:Hello,mynameisJasmine.2)析構(gòu)方法析構(gòu)方法__del__(self)在釋放對(duì)象時(shí)調(diào)用,支持重載,可以在其中進(jìn)行一些釋放資源的操作,不需要顯式調(diào)用。下面的例子說(shuō)明了類的普通成員函數(shù)以及構(gòu)造方法和析構(gòu)方法的作用。>>>classTest:def__init__(self):print('AAAAA')def__del__(self):print('BBBBB')defmyf(self):print('CCCCC')>>>obj=Test()AAAAA>>>obj.myf()CCCCC>>>delobjBBBBB2.類方法、實(shí)例方法和靜態(tài)方法1)類方法類方法是類對(duì)象所擁有的方法,需要用修飾器“@classmethod”來(lái)標(biāo)識(shí)其為類方法,對(duì)于類方法,第一個(gè)參數(shù)必須是類對(duì)象,一般以“cls”作為第一個(gè)參數(shù)。當(dāng)然可以用其他名稱的變量作為其第一個(gè)參數(shù),但是大都習(xí)慣以“cls”作為第一個(gè)參數(shù)的名字,所以一般用“cls”。能夠通過(guò)實(shí)例對(duì)象和類對(duì)象去訪問(wèn)類方法。例如:>>>classPerson:place='Changsha'@classmethod#類方法,用@classmethod來(lái)進(jìn)行修飾defgetPlace(cls):returncls.place>>>p=Person()>>>print(p.getPlace())#可以用過(guò)實(shí)例對(duì)象引用Changsha>>>print(Person.getPlace())#可以通過(guò)類對(duì)象引用Changsha類方法還有一個(gè)用途就是可以對(duì)類屬性進(jìn)行修改。例如:>>>classPerson:place='Changsha'@classmethoddefgetPlace(cls):returncls.place@classmethoddefsetPlace(cls,place1):cls.place=place1>>>p=Person()>>>p.setPlace('Shanghai')#修改類屬性>>>print(p.getPlace())Shanghai>>>print(Person.getPlace())Shanghai2)實(shí)例方法實(shí)例方法是類中最常定義的成員方法,它至少有一個(gè)參數(shù)并且必須以實(shí)例對(duì)象作為其第一個(gè)參數(shù),一般以名為'self'的變量作為第一個(gè)參數(shù),當(dāng)然可以以其他名稱的變量作為第一個(gè)參數(shù)。在類外實(shí)例方法只能通過(guò)實(shí)例對(duì)象去調(diào)用,不能通過(guò)其他方式去調(diào)用。例如:>>>classPerson:place='Changsha'defgetPlace(self):#實(shí)例方法returnself.place>>>p=Person()>>>print(p.getPlace())#正確,可以用過(guò)實(shí)例對(duì)象引用Changsha>>>print(Person.getPlace())#錯(cuò)誤,不能通過(guò)類對(duì)象引用實(shí)例方法3)靜態(tài)方法靜態(tài)方法需要通過(guò)修飾器“@staticmethod”來(lái)進(jìn)行修飾,靜態(tài)方法不需要多定義參數(shù)。例如:>>>classPerson:place='Changsha'@staticmethoddefgetPlace():#靜態(tài)方法returnPerson.place>>>print(Person.getPlace())Changsha9.4.1繼承在Python中,類繼承的定義形式如下:class子類名(父類名):類體在定義一個(gè)類的時(shí)候,可以在類名后面緊跟一對(duì)括號(hào),在括號(hào)中指定所繼承的父類,如果有多個(gè)父類,多個(gè)父類名之間用逗號(hào)隔開(kāi)。9.4繼承和多態(tài)例9-4以大學(xué)里的學(xué)生和教師為例,可以定義一個(gè)父類UniversityMember,然后類Student和類Teacher分別繼承類UniversityMember。9.4.2多重繼承多重繼承的定義形式是:class子類名(父類名1,父類名2,……):類體例9-5多重繼承程序示例。classA():deffoo1(self):print("AAAAA")classB(A):deffoo2(self):

溫馨提示

  • 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)論