




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第8章面向?qū)ο蟆っ嫦驅(qū)ο蟾攀觥?/p>
類與對象·類的成員·構(gòu)造方法和析構(gòu)方法·封裝、繼承、多態(tài)·運算符重載Python快速編程入門理解熟悉掌握熟練
學(xué)習(xí)目標(biāo)理解面向?qū)ο缶幊趟枷爰捌淙筇匦?2掌握類和對象的關(guān)系、類的屬性和方法熟練設(shè)計和使用類34熟悉
運算符的重載目錄頁8.5精彩實例8.2類的定義與使用8.3類的成員8.4特殊方法8.6封裝8.1面向?qū)ο蟾攀瞿夸涰?.11階段案例——銀行管理系統(tǒng)8.7繼承8.8多態(tài)8.9運算符重載8.10精彩實例8.12本章小結(jié)目錄頁8.5精彩實例8.2類的定義與使用8.3類的成員8.4特殊方法8.6封裝8.1面向?qū)ο蟾攀雒嫦驅(qū)ο笫浅绦蜷_發(fā)領(lǐng)域的重要思想,這種思想模擬了人類認(rèn)識客觀世界的思維方式,將開發(fā)中遇到的事物皆看作對象。8.1面向?qū)ο蟾攀雒嫦蜻^程面向?qū)ο蠓治鼋鉀Q問題的步驟使用函數(shù)實現(xiàn)每個步驟的功能按步驟依次調(diào)用函數(shù)分析問題,從中提煉出多個對象將不同對象各自的特征和行為進行封裝通過控制對象的行為來解決問題。8.1面向?qū)ο蟾攀鼍幊趟枷?/p>
實現(xiàn)步驟特點面向過程(1)開始游戲。(2)繪制棋盤畫面。(3)落黑子。(4)繪制棋盤落子畫面。(5)判斷輸贏。(6)落白子。(7)繪制棋盤落子畫面。(8)判斷輸贏:贏則結(jié)束游戲,否則返回步驟(2)。每個步驟的操作都可以封裝為一個函數(shù),按以上步驟逐個調(diào)用函數(shù),即可實現(xiàn)一個五子棋游戲。面向?qū)ο螅?)玩家:黑白雙方,負(fù)責(zé)決定落子的位置。(2)棋盤:負(fù)責(zé)繪制當(dāng)前游戲的畫面,向玩家反饋棋盤的狀況。(3)規(guī)則系統(tǒng):負(fù)責(zé)判斷游戲的輸贏。把解決問題的事物分為多個對象,對象具備解決問題過程中的行為。分別使用面向過程和面向?qū)ο髞韺崿F(xiàn)五子棋8.1面向?qū)ο蟾攀鑫遄悠逵螒颉獙ο筇卣髋c行為8.1面向?qū)ο蟾攀雒嫦蜻^程(1)開始游戲。(2)繪制棋盤畫面。(3)落黑子。(4)繪制棋盤落子畫面。(5)判斷輸贏。(6)落白子。(7)繪制棋盤落子畫面。(8)判斷輸贏:贏則結(jié)束游戲,否則返回步驟(2)。五子棋游戲——對象特征與行為8.1面向?qū)ο蟾攀雒嫦驅(qū)ο螅?)玩家:黑白雙方,負(fù)責(zé)決定落子的位置。(2)棋盤:負(fù)責(zé)繪制當(dāng)前游戲的畫面,向玩家反饋棋盤的狀況。(3)規(guī)則系統(tǒng):負(fù)責(zé)判斷游戲的輸贏。
玩家棋盤規(guī)則系統(tǒng)特征棋子(黑或白子)棋盤數(shù)據(jù)無行為落子顯示棋盤更新棋盤判定勝負(fù)若加入悔棋功能,面向過程和面向?qū)ο?,分別怎么實現(xiàn)呢?8.1面向?qū)ο蟾攀雒嫦蜻^程從輸入、判斷到顯示的一系列步驟都需要改動面向?qū)ο笾恍枰膭悠灞P對象就可以更簡便!8.1面向?qū)ο蟾攀瞿夸涰?.5精彩實例8.3類的成員8.4特殊方法8.6封裝8.1面向?qū)ο蟾攀?.2類的定義與使用8.2類的定義與使用面向?qū)ο缶幊逃袃蓚€非常重要的概念:類和對象。對象映射現(xiàn)實中真實存在的事物,如一本書。具有相同特征和行為的事物的集合統(tǒng)稱為類。對象是根據(jù)類創(chuàng)建的,一個類可以對應(yīng)多個對象。類是對象的抽象,對象是類的實例。8.2.1類的定義類是由3部分組成的:
類的名稱:大駝峰命名法,首字母一般大寫,比如Person。
類的屬性:用于描述事物的特征,比如性別。
類的方法:用于描述事物的行為,比如抬腿。8.2.1類的定義class
類名:屬性名=屬性值def方法名(self):方法體語法格式8.2.1類的定義class
類名:屬性名=屬性值def方法名(self):方法體語法格式classCar:wheels=4 #屬性defdrive(self):#方法
print('行駛')示例8.2.2對象的創(chuàng)建與使用根據(jù)類創(chuàng)建對象的語法格式如下:
對象名=類名()使用對象的本質(zhì)是訪問對象成員:對象名.屬性名對象名.方法名()car=Car()car.wheelscar.drive目錄頁8.5精彩實例8.4特殊方法8.6封裝8.1面向?qū)ο蟾攀?.2類的定義與使用8.3類的成員8.3.1屬性屬性按聲明的方式可以分為兩類:類屬性和實例屬性。8.3.1屬性1.類屬性聲明在類內(nèi)部、方法外部的屬性??梢酝ㄟ^類或?qū)ο筮M行訪問,但只能通過類進行修改。car=Car() #創(chuàng)建對象carprint(Car.wheels) #通過類Car訪問類屬性print(car.wheels) #通過對象car訪問類屬性Car.wheels=3 #通過類Car修改類屬性wheelsprint(Car.wheels)print(car.wheels)car.wheels=4#通過對象car修改類屬性wheelsprint(Car.wheels)print(car.wheels)示例443334car對象不能修改類屬性的值為什么對象訪問的屬性值為4?8.3.1屬性2.實例屬性實例屬性是在方法內(nèi)部聲明的屬性。Python支持動態(tài)添加實例屬性。classCar:defdrive(self):self.wheels=4#添加實例屬性car=Car()#創(chuàng)建對象carcar.drive()print(car.wheels)#通過對象car訪問實例屬性print(Car.wheels)#通過類Car訪問實例屬性示例(1)訪問實例屬性——只能通過對象訪問8.3.1屬性2.實例屬性實例屬性是在方法內(nèi)部聲明的屬性。Python支持動態(tài)添加實例屬性。classCar:defdrive(self):self.wheels=4#添加實例屬性car=Car()#創(chuàng)建對象carcar.drive()self.wheels=3#修改實例屬性print(car.wheels)#通過對象car訪問實例屬性示例(2)修改實例屬性——通過對象修改8.3.1屬性2.實例屬性實例屬性是在方法內(nèi)部聲明的屬性。Python支持動態(tài)添加實例屬性。classCar:defdrive(self):self.wheels=4#添加實例屬性car=Car()#創(chuàng)建對象carcar.drive()self.wheels=3#修改實例屬性print(car.wheels)#通過對象car訪問實例屬性car.color="紅色"#動態(tài)地添加實例屬性print(car.color)示例(3)動態(tài)添加實例屬性——類外部使用對象動態(tài)添加實例屬性3紅色結(jié)果8.3.2方法Python中的方法按定義方式和用途可以分為三類:實例方法、類方法和靜態(tài)方法。1.實例方法形似函數(shù),但它定義在類內(nèi)部。以self為第一個形參,self參數(shù)代表對象本身只能通過對象調(diào)用classCar:defdrive(self):#實例方法
print("我是實例方法")car=Car()car.drive()#通過對象調(diào)用實例方法Car.drive()#通過類調(diào)用實例方法示例8.3.2方法Python中的方法按定義方式和用途可以分為三類:實例方法、類方法和靜態(tài)方法。2.類方法類方法是定義在類內(nèi)部使用裝飾器@classmethod修飾的方法第一個參數(shù)為cls,代表類本身可以通過類和對象調(diào)用classCar:@classmethoddefstop(cls):
#類方法
print("我是類方法")car=Car()示例car.stop() #通過對象調(diào)用類方法Car.stop() #通過類調(diào)用類方法8.3.2方法Python中的方法按定義方式和用途可以分為三類:實例方法、類方法和靜態(tài)方法。2.類方法類方法中可以使用cls訪問和修改類屬性的值classCar:wheels=3 #類屬性
@classmethoddefstop(cls): #類方法
print(cls.wheels) #使用cls訪問類屬性
cls.wheels=4 #使用cls修改類屬性
print(cls.wheels)car=Car()car.stop()示例348.3.2方法Python中的方法按定義方式和用途可以分為三類:實例方法、類方法和靜態(tài)方法。2.靜態(tài)方法靜態(tài)方法是定義在類內(nèi)部使用裝飾器@staticmethod修飾的方法沒有任何默認(rèn)參數(shù)classCar:@staticmethoddeftest():#靜態(tài)方法
print("我是靜態(tài)方法")示例8.3.2方法Python中的方法按定義方式和用途可以分為三類:實例方法、類方法和靜態(tài)方法。2.靜態(tài)方法靜態(tài)方法可以通過類和對象調(diào)用classCar:@staticmethoddeftest():#靜態(tài)方法
print("我是靜態(tài)方法")car=Car()car.test()#通過對象調(diào)用靜態(tài)方法Car.test()#通過類調(diào)用靜態(tài)方法示例8.3.2方法Python中的方法按定義方式和用途可以分為三類:實例方法、類方法和靜態(tài)方法。2.靜態(tài)方法靜態(tài)方法內(nèi)部不能直接訪問屬性或方法,但可以使用類名訪問類屬性或調(diào)用類方法,classCar:wheels=3#類屬性
@staticmethoddeftest():print("我是靜態(tài)方法")print(f"類屬性的值為{Car.wheels}")#靜態(tài)方法中訪問類屬性示例8.3.3私有成員類的成員默認(rèn)是公有成員,可以在類的外部通過類或?qū)ο箅S意地訪問,這樣顯然不夠安全。為了保證類中數(shù)據(jù)的安全,Python支持將公有成員改為私有成員,在一定程度上限制在類的外部對類成員的訪問。8.3.3私有成員Python通過在類成員的名稱前面添加雙下畫線(__)的方式來表示私有成員,語法格式如下:__屬性名__方法名classCar:__wheels=4 #私有屬性
def__drive(self): #私有方法
print("開車")示例8.3.3私有成員私有成員在類的內(nèi)部可以直接訪問,在類的外部不能直接訪問,但可以通過調(diào)用類的公有成員方法的方式進行訪問。classCar:__wheels=4 #私有屬性
def__drive(self): #私有方法
print("行駛")deftest(self):print(f"轎車有{self.__wheels}個車輪") #公有方法中訪問私有屬性
self.__drive()
#公有方法中調(diào)用私有方法示例目錄頁8.5精彩實例8.6封裝8.1面向?qū)ο蟾攀?.2類的定義與使用8.3類的成員8.4特殊方法8.4特殊方法除了8.3節(jié)介紹的方法之外,類中還包括兩個特殊的方法:構(gòu)造方法和析構(gòu)方法,這兩個方法都是系統(tǒng)內(nèi)置方法。構(gòu)造方法指的是__init__()方法。創(chuàng)建對象時系統(tǒng)自動調(diào)用,從而實現(xiàn)對象的初始化。每個類默認(rèn)都有一個__init__()方法,可以在類中顯式定義__init__()方法。__init__()方法可以分為無參構(gòu)造方法和有參構(gòu)造方法。當(dāng)使用無參構(gòu)造方法創(chuàng)建對象時,所有對象的屬性都有相同的初始值。當(dāng)使用有參構(gòu)造方法創(chuàng)建對象時,對象的屬性可以有不同的初始值。8.4.1構(gòu)造方法8.4.1構(gòu)造方法classCar:
def__init__(self): #無參構(gòu)造方法
self.color="紅色"defdrive(self):print(f"車的顏色為:{self.color}")car_one=Car() #創(chuàng)建對象并初始化car_one.drive()car_two=Car() #創(chuàng)建對象并初始化car_two.drive()示例:無參構(gòu)造方法8.4.1構(gòu)造方法classCar:def__init__(self,color): #有參構(gòu)造方法
self.color=color #將形參賦值給屬性
defdrive(self):print(f"車的顏色為:{self.color}")car_one=Car("紅色") #創(chuàng)建對象,并根據(jù)實參初始化屬性car_one.drive()car_two=Car("藍色") #創(chuàng)建對象,并根據(jù)實參初始化屬性car_two.drive()示例:有參構(gòu)造方法析構(gòu)方法(即__del__()方法)是銷毀對象時系統(tǒng)自動調(diào)用的方法每個類默認(rèn)都有一個__del__()方法,可以顯式定義析構(gòu)方法8.4.2析構(gòu)方法classCar:def__init__(self):self.color="藍色"print("對象被創(chuàng)建")def__del__(self):
print("對象被銷毀")car=Car()print(car.color)delcar print(car.color)析構(gòu)方法示例對象被創(chuàng)建藍色對象被銷毀----------------------------------------------------------------NameErrorTraceback(mostrecentcalllast)…--->10print(car.color)NameError:name'car'isnotdefined結(jié)果與文件類似,每個對象都會占用系統(tǒng)的一塊內(nèi)存,使用之后若不及時銷毀,會浪費系統(tǒng)資源。那么對象什么時候銷毀呢?多學(xué)一招:銷毀對象Python通過引用計數(shù)器記錄所有對象的引用(可以理解為對象所占內(nèi)存的別名)數(shù)量,一旦某個對象的引用計數(shù)器的值為0,系統(tǒng)就會銷毀這個對象,收回對象所占用的內(nèi)存空間。多學(xué)一招:銷毀對象目錄頁8.6封裝8.1面向?qū)ο蟾攀?.2類的定義與使用8.3類的成員8.4特殊方法8.5精彩實例本實例要求編寫代碼,實現(xiàn)一個基于面向?qū)ο笏枷氲?、具有添加、刪除、修改、查找聯(lián)系人信息,以及查看所有聯(lián)系人的信息功能的通訊錄程序。8.5.1通訊錄本實例要求編寫代碼,實現(xiàn)一個基于面向?qū)ο笏枷氲摹⒕哂斜硢卧~、添加新單詞、刪除單詞、查找單詞以及清空、退出生詞本功能的生詞本程序。8.5.2生詞本目錄頁8.1面向?qū)ο蟾攀?.2類的定義與使用8.3類的成員8.4特殊方法8.5精彩實例8.6封裝封裝是面向?qū)ο蟮闹匾匦灾?,它的基本思想是對外隱藏類的細節(jié),提供用于訪問類成員的公開接口。如此,類的外部無需知道類的實現(xiàn)細節(jié),只需要使用公開接口便可訪問類的內(nèi)容,這在一定程度上保證了類內(nèi)數(shù)據(jù)的安全。8.6封裝為了契合封裝思想,我們在定義類時需要滿足以下兩點要求。1.將類屬性聲明為私有屬性。2.添加兩類供外界調(diào)用的公有方法,分別用于設(shè)置或獲取私有屬性的值。8.6封裝8.6封裝classPerson:def__init__(self,name):=name#姓名
self.__age=1#年齡,默認(rèn)為1歲,私有屬性
#設(shè)置私有屬性值的方法
defset_age(self,new_age):if0<new_age<=120:#判斷年齡是否合法
self.__age=new_age#獲取私有屬性值的方法
defget_age(self):returnself.__age示例person=Person("小明")person.set_age(20)print(f"年齡為{person.get_age()}歲")調(diào)用目錄頁8.11階段案例——銀行管理系統(tǒng)8.10精彩實例8.12本章小結(jié)8.9運算符重載8.8多態(tài)8.7繼承繼承是面向?qū)ο蟮闹匾匦灾?,它主要用于描述類與類之間的關(guān)系,在不改變原有類的基礎(chǔ)上擴展原有類的功能。若類與類之間具有繼承關(guān)系,被繼承的類稱為父類或基類,繼承其他類的類稱為子類或派生類,子類會自動擁有父類的公有成員。8.7繼承單繼承即子類只繼承一個父類。現(xiàn)實生活中,波斯貓、折耳貓、短毛貓都屬于貓類,它們之間存在的繼承關(guān)系即為單繼承,如圖所示。8.7.1單繼承Python中單繼承的語法格式如下所示:class子類名(父類名):子類繼承父類的同時會自動擁有父類的公有成員。自定義類默認(rèn)繼承基類object。8.7.1單繼承classCat(object):def__init__(self,color):self.color=colordefwalk(self):print("走貓步~")#定義繼承Cat的ScottishFold類classScottishFold(Cat):passfold=ScottishFold("灰色")#創(chuàng)建子類的對象print(f"{fold.color}的折耳貓")#子類訪問從父類繼承的屬性fold.walk()#子類調(diào)用從父類繼承的方法示例子類不會擁有父類的私有成員,也不能訪問父類的私有成員。8.7繼承8.7.1單繼承classCat(object):def__init__(self,color):self.color=color#增加私有屬性
self.__age=1defwalk(self):print("走貓步~")def__test(self):#增加私有方法
print("測試")def__test(self):print("父類的私有方法")print(fold.__age) #子類訪問父類的私有屬性fold.__test() #子類調(diào)用父類的私有方法示例AttributeError:'ScottishFold'objecthasnoattribute'__age'AttributeError:'ScottishFold'objecthasnoattribute'__test'程序中的一個類也可以繼承多個類,如此子類具有多個父類,也自動擁有所有父類的公有成員。8.7.2多繼承Python中多繼承的語法格式如下所示:class子類名(父類名1,父類名2,...):8.7.2多繼承#定義一個表示房屋的類classHouse(object):deflive(self): #居住
print("供人居住")#定義一個表示汽車的類classCar(object):defdrive(self): #行駛
print("行駛")#定義一個表示房車的類classTouringCar(House,Car):passtour_car=TouringCar()tour_car.live() #子類對象調(diào)用父類House的方法tour_car.drive() #子類對象調(diào)用父類Car的方法示例如果House類和Car類中有一個同名的方法,那么子類會調(diào)用哪個父類的同名方法呢?8.7.2多繼承如果子類繼承的多個父類是平行關(guān)系的類,那么子類先繼承哪個類,便會先調(diào)用哪個類的方法。8.7.2多繼承子類會原封不動地繼承父類的方法,但子類有時需要按照自己的需求對繼承來的方法進行調(diào)整,也就是在子類中重寫從父類繼承來的方法。8.7.3重寫在子類中定義與父類方法同名的方法,在方法中按照子類需求重新編寫功能代碼即可。8.7.3重寫#定義一個表示人的類classPerson(object):defsay_hello(self):print("打招呼!")#定義一個表示中國人的類classChinese(Person):defsay_hello(self): #重寫的方法
print("吃了嗎?")chinese=Chinese()chinese.say_hello() #子類調(diào)用重寫的方法示例子類重寫了父類的方法之后,無法直接訪問父類的同名方法,但可以使用super()函數(shù)間接調(diào)用父類中被重寫的方法。8.7.3重寫#定義一個表示中國人的子類classChinese(Person):defsay_hello(self):
super().say_hello()#調(diào)用父類被重寫的方法
print("吃了嗎?")示例目錄頁8.11階段案例——銀行管理系統(tǒng)8.7繼承8.10精彩實例8.12本章小結(jié)8.9運算符重載8.8多態(tài)多態(tài)是面向?qū)ο蟮闹匾匦灾?,它的直接表現(xiàn)即讓不同類的同一功能可以通過同一個接口調(diào)用,表現(xiàn)出不同的行為。8.8多態(tài)8.8多態(tài)classCat:defshout(self):print("喵喵喵~")classDog:defshout(self):print("汪汪汪!")定義defshout(obj):obj.shout()cat=Cat()dog=Dog()shout(cat)shout(dog)調(diào)用喵喵喵~汪汪汪!結(jié)果目錄頁8.11階段案例——銀行管理系統(tǒng)8.7繼承8.8多態(tài)8.10精彩實例8.12本章小結(jié)8.9運算符重載運算符重載是指賦予內(nèi)置運算符新的功能,使內(nèi)置運算符能適應(yīng)更多的數(shù)據(jù)類型。8.9運算符重載基類object中提供的一些特殊方法及其對應(yīng)的運算符如表所示。特殊方法運算符__add__()+__sub__()-__mul__()*__truediv__()/__mod__()%__pow__()**__contains__()in__eq__()、__ne__()、__lt__()、__le__()、__、gt__()、__ge__()==、!=、<、<=、>、>=__and__()、__or__()、__invert__()、__xor__()&、|、~、^__iadd__()、__isub__()、__imul__()、__itruediv__()+=、-=、*=、/=8.9運算符重載如果類中重寫了Python基類object內(nèi)置的有關(guān)運算符的特殊方法,那么該特殊方法對應(yīng)的運算符將支持對該類的實例進
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 客戶溝通與反饋記錄
- 小王子遇見世界的觀后感
- 高中化學(xué)實驗設(shè)計與探究:化學(xué)反應(yīng)原理教案
- 《初高中英語語法比較與辨析教案》
- 不動產(chǎn)交易買賣協(xié)議書
- 中學(xué)生歷史事件故事讀后感
- 美容師儀器知識培訓(xùn)課件
- 血液++課件-2024-2025學(xué)年北師大版生物七年級下冊
- 紅色故事鐵道游擊隊的愛國主義教育解讀
- 教育資源整合及教育信息化建設(shè)方案
- 外周血管的介入治療課件
- 《當(dāng)代廣播電視概論》(廣播電視發(fā)明與技術(shù)基礎(chǔ))課件
- 核心能力模型庫(-勝任力模型-)
- 高中地理 紐約的發(fā)展 紐約的輻射功能 城市的輻射功能 作業(yè)設(shè)計
- 5.3.2.2函數(shù)的最大(?。┲?課件(共20張PPT)
- TSG-R0005-2022《移動式壓力容器安全技術(shù)監(jiān)察規(guī)程》(2022版)
- 2020 ACLS-PC-SA課前自我測試試題及答案
- 上市公司組織架構(gòu)策略
- DB34∕T 3968-2021 橋梁健康監(jiān)測系統(tǒng)運營維護與管理規(guī)范
- 加氣混凝土砌塊砌筑規(guī)范標(biāo)準(zhǔn)[詳]
- 定語從句漢譯英
評論
0/150
提交評論