Python程序設(shè)計(jì)基礎(chǔ)-教學(xué)課件 第8章 面向?qū)ο蟪绦蛟O(shè)計(jì)_第1頁(yè)
Python程序設(shè)計(jì)基礎(chǔ)-教學(xué)課件 第8章 面向?qū)ο蟪绦蛟O(shè)計(jì)_第2頁(yè)
Python程序設(shè)計(jì)基礎(chǔ)-教學(xué)課件 第8章 面向?qū)ο蟪绦蛟O(shè)計(jì)_第3頁(yè)
Python程序設(shè)計(jì)基礎(chǔ)-教學(xué)課件 第8章 面向?qū)ο蟪绦蛟O(shè)計(jì)_第4頁(yè)
Python程序設(shè)計(jì)基礎(chǔ)-教學(xué)課件 第8章 面向?qū)ο蟪绦蛟O(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩26頁(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)介

第8章

面向?qū)ο蟪绦蛟O(shè)計(jì)目錄8.1類與對(duì)象8.2類的成員8.48.58.7類的繼承8.38.68.8成員可見(jiàn)性特殊方法封裝多態(tài)運(yùn)算符重載8.1類與對(duì)象類和對(duì)象的關(guān)系即為數(shù)據(jù)類型與變量的關(guān)系,根據(jù)一個(gè)類可以創(chuàng)建多個(gè)對(duì)象,而每個(gè)對(duì)象只能是某一個(gè)類的對(duì)象。類規(guī)定了可以用于存儲(chǔ)什么類型數(shù)據(jù),而對(duì)象用于實(shí)際存儲(chǔ)數(shù)據(jù),每個(gè)對(duì)象可存儲(chǔ)不同的數(shù)據(jù),數(shù)據(jù)即屬性。例如,有一個(gè)教師類,其中包括教師工號(hào)和姓名兩個(gè)屬性,則根據(jù)教師類可以創(chuàng)建多個(gè)教師對(duì)象,每個(gè)教師對(duì)象可以具有不同的教師工號(hào)和姓名信息。

8.1.1類的定義在一個(gè)類中,除了可以包含前面所說(shuō)的屬性,還可以包含各種方法。屬性對(duì)應(yīng)一個(gè)類可以用來(lái)保存哪些數(shù)據(jù),而方法對(duì)應(yīng)一個(gè)類可以支持哪些操作(即數(shù)據(jù)處理)。類中的屬性對(duì)應(yīng)前面所學(xué)習(xí)的變量,而類中的方法對(duì)應(yīng)前面所學(xué)習(xí)的函數(shù)。通過(guò)類,可以把數(shù)據(jù)和操作封裝在一起,從而使得程序結(jié)構(gòu)更加清晰,這也就是所謂類的封裝性。類的語(yǔ)法格式如下所示:

class類名:

屬性名=屬性值

def方法名(self):

方法體

8.1.2對(duì)象的創(chuàng)建與使用

對(duì)象可以是人們要進(jìn)行研究的任何事物,從最簡(jiǎn)單的整數(shù)到復(fù)雜的飛機(jī)等均可看作對(duì)象,它不僅能表示具體的事物,還能表示抽象的規(guī)則,計(jì)劃或事件;它能夠直接反映現(xiàn)實(shí)生活中的事物,例如人、車、小鳥等。根據(jù)類創(chuàng)建對(duì)象的語(yǔ)法格式如下:對(duì)象名=類名()【例8-2】創(chuàng)建教師類Teacher對(duì)象示例。teacher=Teacher()

對(duì)象的使用本質(zhì)上就是對(duì)類或?qū)ο蟪蓡T的使用,即訪問(wèn)屬性或調(diào)用方法。訪問(wèn)屬性或調(diào)用方法的語(yǔ)法格式如下所示:

對(duì)象名.屬性名

對(duì)象名.方法名()

8.2類的成員——屬性屬性是類的成員之一,它是類的實(shí)例的狀態(tài)。屬性按照聲明的方式分為類屬性和實(shí)例屬性兩種。(1)類屬性類屬性是聲明在類內(nèi)部、方法外部的屬性。類屬性可以通過(guò)類和對(duì)象進(jìn)行訪問(wèn),但只能通過(guò)類進(jìn)行修改。8.2類的成員——屬性(2)實(shí)例屬性實(shí)例屬性是在方法內(nèi)部聲明的屬性,Python支持動(dòng)態(tài)添加實(shí)例屬性。下面從訪問(wèn)實(shí)例屬性、修改實(shí)例屬性和動(dòng)態(tài)添加實(shí)例屬性3個(gè)方面對(duì)實(shí)例屬性進(jìn)行介紹。1)訪問(wèn)實(shí)例屬性實(shí)例屬性只能通過(guò)對(duì)象進(jìn)行訪問(wèn)?!纠?-5】訪問(wèn)實(shí)例屬性示例。classTeacher:department="SoftwareEngineering"defplace(self):self.address="Liaoning"#添加實(shí)例對(duì)象

teacher=Teacher()teacher.place()print(teacher.address)print(Teacher.address)運(yùn)行結(jié)果:Liaoning---------------------------------------------------------------------------------AttributeErrorTraceback(mostrecentcalllast)<ipython-input-2-f62de8e93d45>in<module>

7teacher.place()

8print(teacher.address)---->9

print(Teacher.address)AttributeError:typeobject'Teacher'hasnoattribute'address'8.2類的成員——屬性2)修改實(shí)例屬性實(shí)例屬性通過(guò)對(duì)象進(jìn)行修改?!纠?-6】修改實(shí)例屬性示例。classTeacher:department="SoftwareEngineering"defplace(self):self.address="Liaoning"#添加實(shí)例對(duì)象

teacher=Teacher()teacher.place()teacher.address="Shandong"print(teacher.address)運(yùn)行結(jié)果:Shandong8.2類的成員——屬性3)動(dòng)態(tài)添加實(shí)例屬性Python支持在類的外部使用對(duì)象動(dòng)態(tài)地添加實(shí)例屬性?!纠?-7】動(dòng)態(tài)添加實(shí)例屬性示例。classTeacher:department="SoftwareEngineering"defplace(self):self.hometown="Liaoning"#添加實(shí)例屬性

teacher=Teacher()teacher.place()="Lidan"#添加實(shí)例屬性teacher.age=35#添加實(shí)例屬性

print(f"該教師名字為:{}")print(f"該教師年齡為:{teacher.age}")print(f"該教師籍貫為:{teacher.hometown}")print(f"該教師所在的系為:{teacher.department}")運(yùn)行結(jié)果:該教師名字為:Lidan該教師年齡為:35該教師籍貫為:Liaoning該教師所在的系為:SoftwareEngineering8.2類的成員——方法Python中的方法按定義方式和用途可以分為三類:實(shí)例方法、類方法和靜態(tài)方法。(1)實(shí)例方法實(shí)例方法是類中定義的函數(shù),它們的第一個(gè)參數(shù)通常是“self”,表示對(duì)類的實(shí)例對(duì)象的引用。實(shí)例方法可以訪問(wèn)并操作類的屬性和方法,只能通過(guò)對(duì)象調(diào)用?!纠?-8】實(shí)例方法示例。classTeacher:department="SoftwareEngineering"defplace(self):#定義實(shí)例方法

self.hometown="Liaoning"print("我是實(shí)例方法")print(self.hometown)

teacher=Teacher()teacher.place()Teacher.place()運(yùn)行結(jié)果:我是實(shí)例方法Liaoning----------------------------------------------------------------------------------TypeErrorTraceback(mostrecentcalllast)<ipython-input-7-d4f1d0055d0c>in<module>

7teacher=Teacher()

8teacher.place()---->9

Teacher.place()TypeError:place()missing1requiredpositionalargument:'self'8.2類的成員——方法(2)類方法類方法是指定義在類內(nèi)部,使用裝飾器@classmethod修飾的方法。類方法的語(yǔ)法格式如下所示:

@classmethoddef類方法名(cls):方法體類方法中的參數(shù)列表的第一個(gè)參數(shù)為cls,代表類本身(類似于實(shí)例方法中的self),它會(huì)在類方法被調(diào)用時(shí)自動(dòng)接收由系統(tǒng)傳遞的調(diào)用該方法的類。類方法可以通過(guò)類和對(duì)象調(diào)用。8.2類的成員——方法(3)靜態(tài)方法靜態(tài)方法是定義在類內(nèi)部,使用裝飾器@staticmethod修飾的方法。與類方法相比,靜態(tài)方法沒(méi)有任何默認(rèn)參數(shù),它適用于與類無(wú)關(guān)的操作,或者無(wú)需使用類成員的操作。【例8-11】靜態(tài)方法示例。classTeacher:department="SoftwareEngineering"@staticmethoddefplace():#定義靜態(tài)方法

print("我是靜態(tài)方法")

teacher=Teacher()teacher.place()#通過(guò)對(duì)象調(diào)用靜態(tài)方法Teacher.place()#通過(guò)類調(diào)用靜態(tài)方法

運(yùn)行結(jié)果:我是靜態(tài)方法我是靜態(tài)方法Python

中沒(méi)有關(guān)鍵字去修飾成員,默認(rèn)

Python

中所有的成員都是公有成員,可以在類的外部通過(guò)類或?qū)ο箅S意訪問(wèn)。8.3成員可見(jiàn)性——公有成員【例8-13】公有成員示例。classStudent:address='遼寧'#屬性stu=Student()#實(shí)例對(duì)象print(Student.address)#通過(guò)類訪問(wèn)屬性并輸出print(stu.address)#通過(guò)實(shí)例對(duì)象訪問(wèn)屬性并輸出運(yùn)行結(jié)果:遼寧遼寧結(jié)果分析:此代碼定義一個(gè)Student類,接著定義一個(gè)屬性address,創(chuàng)建對(duì)象stu。從以上結(jié)果可以看出,類的公有成員屬性可以在類的外部通過(guò)類或?qū)ο箅S意訪問(wèn)。根據(jù)公有成員在安全上的局限性,為保證類中數(shù)據(jù)的安全,Python

支持將公有成員改成私有成員,在一定程度上限制在類的外部對(duì)類的訪問(wèn)。Python

通過(guò)在類成員的名稱前面添加上雙下劃線(__)的方式來(lái)表示私有成員,語(yǔ)法格式如下所示:__屬性名__方法名8.3成員可見(jiàn)性——私有成員在

Python

中,類的保護(hù)成員是指以一個(gè)下劃線開(kāi)頭的成員變量或方法,例如

_address、_getschool()

。受保護(hù)的成員可以在類的內(nèi)部和子類中訪問(wèn),但是在類的外部不應(yīng)該直接訪問(wèn)。8.3成員可見(jiàn)性——保護(hù)成員【例8-16】保護(hù)成員示例。classStudent:_address="遼寧"def_getschool(self):print("我在"+self._address+"上大學(xué)")stu=Student()

stu._getschool()#訪問(wèn)保護(hù)型方法print(stu._address)

#訪問(wèn)保護(hù)型屬性運(yùn)行結(jié)果:我在遼寧上大學(xué)遼寧Python

中,類的構(gòu)造方法為

__init__()

方法,創(chuàng)建對(duì)象時(shí)系統(tǒng)自動(dòng)調(diào)用,負(fù)責(zé)在創(chuàng)建對(duì)象時(shí)對(duì)對(duì)象進(jìn)行初始化。每個(gè)類默認(rèn)都有一個(gè)

__init__()

方法,可以在類中顯式定義

__init__()

方法。__init__()

方法可以分為無(wú)參構(gòu)造方法和有參構(gòu)造方法。8.4.1構(gòu)造方法當(dāng)使用無(wú)參構(gòu)造方法創(chuàng)建對(duì)象時(shí),所有對(duì)象的屬性都有相同的初始值。1當(dāng)使用有參構(gòu)造方法常見(jiàn)對(duì)象時(shí),所有對(duì)象的屬性可以有不同的初始值。28.4.1構(gòu)造方法【例8-17】無(wú)參構(gòu)造方法示例。classStudent:def__init__(self):="張三"defeat(self):print(f'{}在吃飯')stu_one=Student()stu_one.eat()stu_two=Student()stu_two.eat()運(yùn)行結(jié)果:張三在吃飯張三在吃飯【例8-18】有參構(gòu)造方法示例。classStudent:def__init__(self,name):=namedefeat(self):print(f'{}在吃飯')stu_one=Student("張三")stu_one.eat()stu_two=Student("李四")stu_two.eat()運(yùn)行結(jié)果:張三在吃飯李四在吃飯8.4.2析構(gòu)方法

析構(gòu)方法是類的另一個(gè)內(nèi)置方法,其方法名為

__del__()

,在銷毀一個(gè)對(duì)象時(shí)系統(tǒng)自動(dòng)調(diào)用的方法,負(fù)責(zé)完成待銷毀對(duì)象的資源清理工作,如關(guān)閉文件等。每個(gè)類默認(rèn)都有一個(gè)

__del__()

方法,也可以顯式定義析構(gòu)方法?!纠?-19】析構(gòu)方法示例。classStudent:def__init__(self,name):#定義構(gòu)造方法

=nameprint(f"姓名為{}的對(duì)象被創(chuàng)建!")def__del__(self):#定義析構(gòu)方法

print(f"姓名為{}的對(duì)象被銷毀!")

deffunc(name):stu=Student(name)#創(chuàng)建Student類對(duì)象stu

stu_one=Student("張三")#創(chuàng)建Student類對(duì)象stu_onestu_two=Student("李四")#創(chuàng)建Student類對(duì)象stu_twostu_three=stu_twodelstu_two#使用del刪除對(duì)象stu_twofunc("吳六")#調(diào)用func函數(shù)delstu_three#使用del刪除對(duì)象stu_threestu_four=Student("劉七")運(yùn)行結(jié)果:姓名為張三的對(duì)象被創(chuàng)建!姓名為李四的對(duì)象被創(chuàng)建!姓名為吳六的對(duì)象被創(chuàng)建!姓名為吳六的對(duì)象被銷毀!姓名為李四的對(duì)象被銷毀!姓名為劉七的對(duì)象被創(chuàng)建!8.5

封裝

封裝是面向?qū)ο蟮闹匾匦灾?,它的基本思想是?duì)外隱藏類的細(xì)節(jié),將數(shù)據(jù)和方法封裝在一個(gè)單獨(dú)的類中,使得外部無(wú)法直接訪問(wèn)和修改數(shù)據(jù),只能通過(guò)類的方法來(lái)訪問(wèn)和修改數(shù)據(jù)。封裝的目的是隱藏類的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),使得類的用戶只需要關(guān)心類提供的公共接口,而不關(guān)心類的內(nèi)部實(shí)現(xiàn),這在一定程度上保證了類內(nèi)數(shù)據(jù)的安全。為了契合封裝思想,在定義類時(shí)需要滿足以下兩點(diǎn)要求。添加兩類供外界調(diào)用的公有方法,分別用于設(shè)置或獲取私有屬性的值。將類屬性聲明為私有屬性。02018.6類的繼承——單繼承

在類層次中,子類只繼承一個(gè)父類的數(shù)據(jù)結(jié)構(gòu)和方法,稱為單繼承,即子類只繼承一個(gè)父類。現(xiàn)實(shí)生活中,蝴蝶犬、貴婦犬、邊牧犬都屬于狗類,它們之間存在的繼承關(guān)系即為單繼承。Python中單繼承的語(yǔ)法格式如下所示:class子類名(父類名)子類繼承父類的同時(shí)會(huì)自動(dòng)擁有父類的公有方法和屬性。若在定義時(shí)沒(méi)有指明該類的父類,那么該類自動(dòng)繼承object類。8.6類的繼承——多繼承

現(xiàn)實(shí)生活中很多事物是多個(gè)事物的組合,讓他們同時(shí)具有多個(gè)實(shí)物的特征或行為,例如房車是房屋和汽車的組合,既具有房屋的居住行為,也具有汽車的行駛行為。玩具車是玩具和車的組合,既有玩具的特性也有車的特征。

在類層次中,子類繼承了多個(gè)父親的數(shù)據(jù)結(jié)構(gòu)和方法,稱為多繼承。程序中的一個(gè)類可以繼承多個(gè)類,即子類具有多個(gè)父類,也自動(dòng)擁有所有父類的公有成員。Python中多繼承的語(yǔ)法格式如下所示:class子類名(父類名1,父類名2,…):8.6類的繼承——重寫在子類中定義與父類方法同名的方法,在方法中按照子類需求重新編寫功能代碼即可?!纠?-25】重寫示例。classAnimal:defmake_sound(self):print("Animalmakessound")

classDog(Animal):defmake_sound(self):#重寫的方法

print("Dogbarks")

#使用示例animal=Animal()animal.make_sound()dog=Dog()dog.make_sound()#子類調(diào)用了重寫的方法運(yùn)行結(jié)果:AnimalmakessoundDogbarks重寫的目的是為了實(shí)現(xiàn)多態(tài)(Polymorphism),即同樣的方法名可以在不同的類中實(shí)現(xiàn)不同的行為。通過(guò)重寫,可以在子類中實(shí)現(xiàn)與父類中同名的方法,以實(shí)現(xiàn)不同的行為,從而實(shí)現(xiàn)多態(tài)。8.7

多態(tài)多態(tài)是面向?qū)ο蟮闹匾匦灾?,它的直接表現(xiàn)即讓不同類的同一功能可以通過(guò)同一個(gè)接口調(diào)用,表現(xiàn)出不同的行為?!纠?-27】多態(tài)示例。classAnimal(object):defeat(self):print('動(dòng)物會(huì)吃')classDog(Animal):defeat(self):print('狗吃骨頭')classCat(Animal):defeat(self):print('貓吃魚')classPerson:defeat(self):print('人吃五谷雜糧')deffun(obj):obj.eat()fun(Animal())fun(Dog())fun(Cat())fun(Person())運(yùn)行結(jié)果:動(dòng)物會(huì)吃狗吃骨頭貓吃魚人吃五谷雜糧此代碼定義一個(gè)動(dòng)物類Animal,貓類Cat和狗類Dog都繼承動(dòng)物類Animal,定義一個(gè)人類Person,為這四個(gè)類都定義一個(gè)方法eat(),接著定義一個(gè)函數(shù),此函數(shù)通過(guò)同一個(gè)接口obj分別調(diào)用了動(dòng)物類Animal、狗類Dog、貓類Cat和人類Person的eat()方法,不同的對(duì)象收到同一消息產(chǎn)生不同的結(jié)果,體現(xiàn)了面向?qū)ο蟮亩鄳B(tài)性。8.8運(yùn)算符重載在

Python

中,可以通過(guò)在類中定義特殊方法來(lái)實(shí)現(xiàn)運(yùn)算符重載。運(yùn)算符重載是指賦予內(nèi)置運(yùn)算符新的功能,使內(nèi)置運(yùn)算符能適應(yīng)更多的數(shù)據(jù)類型。在

Python

中,可以重載很多不同的運(yùn)算符,例如+、-、*、/、==、<等等。每個(gè)運(yùn)算符都對(duì)應(yīng)一個(gè)特殊方法,可以在類中定義這些特殊方法來(lái)重載對(duì)應(yīng)的運(yùn)算符。下面是一些常用的運(yùn)算符及其對(duì)應(yīng)的特殊方法:·

+

運(yùn)算符對(duì)應(yīng)__add__

方法:在類中定義__add__

方法來(lái)重載+

運(yùn)算符,以實(shí)現(xiàn)加法運(yùn)算?!?/p>

-

運(yùn)算符對(duì)應(yīng)__sub__

方法:在類中定義__sub__

方法來(lái)重載-

運(yùn)算符,以實(shí)現(xiàn)減法運(yùn)算。·

*

運(yùn)算符對(duì)應(yīng)__mul__

方法:在類中定義__mul__

方法來(lái)重載*

運(yùn)算符,以實(shí)現(xiàn)乘法運(yùn)算。·

/

運(yùn)算符對(duì)應(yīng)__truediv__

方法:在類中定義__truediv__

方法來(lái)重載/

運(yùn)算符,以實(shí)現(xiàn)除法運(yùn)算。//

運(yùn)算符對(duì)應(yīng)__floordiv__

方法:在類中定義__floordiv__

方法來(lái)重載//

運(yùn)算符,以實(shí)現(xiàn)整除運(yùn)算。8.8運(yùn)算符重載

%運(yùn)算符對(duì)應(yīng)__mod__方法:在類中定義__mod__方法來(lái)重載%運(yùn)算符,以實(shí)現(xiàn)取模運(yùn)算。**運(yùn)算符對(duì)應(yīng)__pow__方法:在類中定義__pow__

溫馨提示

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