Python程序設(shè)計(jì)基礎(chǔ)案例教程 課件 第7章 面向?qū)ο骭第1頁(yè)
Python程序設(shè)計(jì)基礎(chǔ)案例教程 課件 第7章 面向?qū)ο骭第2頁(yè)
Python程序設(shè)計(jì)基礎(chǔ)案例教程 課件 第7章 面向?qū)ο骭第3頁(yè)
Python程序設(shè)計(jì)基礎(chǔ)案例教程 課件 第7章 面向?qū)ο骭第4頁(yè)
Python程序設(shè)計(jì)基礎(chǔ)案例教程 課件 第7章 面向?qū)ο骭第5頁(yè)
已閱讀5頁(yè),還剩123頁(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)介

面向?qū)ο髮W(xué)習(xí)目標(biāo)/Target理解面向?qū)ο缶幊蹋∣OP)的核心思想,熟練掌握類與對(duì)象的定義及創(chuàng)建方法,明確屬性和方法的作用熟練運(yùn)用繼承機(jī)制,掌握方法重寫技巧,通過(guò)代碼復(fù)用提高程序開發(fā)效率與可維護(hù)性精準(zhǔn)區(qū)分公有與私有成員,靈活運(yùn)用構(gòu)造方法完成對(duì)象的初始化,實(shí)現(xiàn)數(shù)據(jù)的合理封裝與管理學(xué)習(xí)目標(biāo)/Target理解面向?qū)ο蟮娜筇匦裕悍庋b、繼承、多態(tài),能夠設(shè)計(jì)繼承系統(tǒng)復(fù)用代碼,利用多態(tài)簡(jiǎn)化程序設(shè)計(jì)理解抽象類的設(shè)計(jì)理念,能夠運(yùn)用多態(tài)特性編寫具有擴(kuò)展性和靈活性的程序代碼章節(jié)概述/Summary在掌握Python基礎(chǔ)語(yǔ)法后,面對(duì)復(fù)雜的現(xiàn)實(shí)問(wèn)題,如何高效組織代碼、實(shí)現(xiàn)復(fù)用與擴(kuò)展?面向?qū)ο缶幊蹋∣OP)提供了強(qiáng)大解決方案。它以“類”定義對(duì)象的特征與行為,通過(guò)封裝數(shù)據(jù)和方法模擬現(xiàn)實(shí)世界,借助繼承與多態(tài)提升代碼靈活性。本章將深入學(xué)習(xí)Python的OOP特性,從類與對(duì)象的基礎(chǔ)概念到封裝、繼承、多態(tài)等核心技術(shù),掌握用面向?qū)ο笏枷朐O(shè)計(jì)代碼的方法,為構(gòu)建復(fù)雜軟件系統(tǒng)奠定基礎(chǔ)。目錄/Contents010203【案例7-1】智慧圖書借閱管理系統(tǒng)【案例7-1】幾何圖形計(jì)算器【案例7-1】垃圾分類處理查詢系統(tǒng)【案例7-1】智慧圖書借閱管理系統(tǒng)01案例分析傳統(tǒng)的圖書管理方式依賴人工操作,如借閱登記、歸還手續(xù)、庫(kù)存盤點(diǎn)等,不僅耗時(shí)費(fèi)力,而且容易出現(xiàn)錯(cuò)誤。在數(shù)字化浪潮席卷全球、科技創(chuàng)新不斷重塑社會(huì)生活的當(dāng)下,圖書館作為知識(shí)傳播與文化傳承的重要陣地,正借助前沿技術(shù)實(shí)現(xiàn)向智能化、高效化轉(zhuǎn)型。智慧圖書借閱管理系統(tǒng)應(yīng)運(yùn)而生,它不僅是技術(shù)革新在文化領(lǐng)域的生動(dòng)實(shí)踐,更是科技創(chuàng)新賦能文化傳播、推動(dòng)全民閱讀的重要體現(xiàn)。案例分析智慧圖書借閱管理系統(tǒng)中有6個(gè)功能,每個(gè)功能都對(duì)應(yīng)一個(gè)序號(hào),用戶可根據(jù)下方的提示“請(qǐng)選擇功能:”輸入序號(hào)執(zhí)行相應(yīng)的操作。查詢圖書:用戶可根據(jù)書名、作者、ISBN等多種條件,在系統(tǒng)中快速檢索目標(biāo)圖書,系統(tǒng)會(huì)展示符合條件的圖書列表及其詳細(xì)信息、借閱狀態(tài)等。案例分析借閱圖書:用戶選定所需圖書后,通過(guò)該功能完成借閱流程,系統(tǒng)自動(dòng)記錄借閱人信息、借閱時(shí)間,并將圖書狀態(tài)更新為“已借出”。歸還圖書:當(dāng)閱讀完畢后,使用此功能歸還圖書,系統(tǒng)會(huì)驗(yàn)證圖書信息,更新圖書狀態(tài)為“可借閱”,并完成借閱記錄的相應(yīng)處理,確保館藏狀態(tài)的實(shí)時(shí)準(zhǔn)確性。案例分析查看所有圖書:系統(tǒng)以列表或其他可視化形式展示圖書館內(nèi)全部圖書資源,包含每本書的基本信息及當(dāng)前狀態(tài),方便管理員全面掌握館藏情況,也可供讀者瀏覽圖書館資源全貌。案例分析統(tǒng)計(jì)圖書數(shù)量:自動(dòng)統(tǒng)計(jì)圖書館內(nèi)圖書的總數(shù),為圖書館的資源采購(gòu)、管理決策提供數(shù)據(jù)依據(jù)。退出系統(tǒng):用戶完成操作后,選擇該功能安全退出智慧圖書借閱管理系統(tǒng),關(guān)閉當(dāng)前會(huì)話,保護(hù)用戶信息安全,同時(shí)釋放系統(tǒng)資源,確保系統(tǒng)運(yùn)行的穩(wěn)定性。知識(shí)儲(chǔ)備面向?qū)ο缶幊填惻c對(duì)象屬性方法知識(shí)儲(chǔ)備私有成員構(gòu)造方法知識(shí)儲(chǔ)備—面相對(duì)象編程面向?qū)ο缶幊蹋∣bject-OrientedProgramming,OOP)是一種程序設(shè)計(jì)思想,它以對(duì)象為中心,將數(shù)據(jù)和操作數(shù)據(jù)的方法(函數(shù))組合到一個(gè)單元中,這個(gè)單元就是對(duì)象。每個(gè)對(duì)象都是類的一個(gè)實(shí)例,而類則定義了對(duì)象的屬性(數(shù)據(jù))和方法(代碼)。換句話說(shuō),面向?qū)ο缶幊虒F(xiàn)實(shí)世界中的實(shí)體抽象為程序中的對(duì)象,這些對(duì)象可以相互交互、傳遞消息,并且可以繼承和擴(kuò)展。知識(shí)儲(chǔ)備—面相對(duì)象編程面向?qū)ο缶幊掏ǔ>哂幸韵聨讉€(gè)核心概念:類(Class):用來(lái)描述具有相同的屬性和方法的對(duì)象的集合。它定義了該集合中每個(gè)對(duì)象所共有的屬性和方法。對(duì)象(Object):對(duì)象是類的一個(gè)具體實(shí)例,通過(guò)類可以創(chuàng)建多個(gè)對(duì)象。封裝(Encapsulation):將數(shù)據(jù)(屬性)和操作數(shù)據(jù)的方法(函數(shù))封裝到對(duì)象中,使得對(duì)象的內(nèi)部細(xì)節(jié)對(duì)外部不可見(jiàn)。繼承(Inheritance):允許一個(gè)類(子類)繼承另一個(gè)類(父類)的屬性和方法,并且可以添加自己的特定屬性和方法。多態(tài)(Polymorphism):允許不同類的對(duì)象對(duì)同一個(gè)方法做出不同的響應(yīng),提高代碼的靈活性和可重用性。知識(shí)儲(chǔ)備—面相對(duì)象編程面向?qū)ο缶幊痰膬?yōu)點(diǎn):模塊化:OOP將代碼分成小的、可管理的部分(類和對(duì)象),使得程序更加模塊化。這樣做的好處是,如果某一部分需要更改,不會(huì)影響整個(gè)系統(tǒng)。代碼重用:通過(guò)繼承和組合,可以在不重新編寫代碼的情況下擴(kuò)展已有類的功能,從而提高代碼的復(fù)用性。易于維護(hù):由于OOP的結(jié)構(gòu)化,程序員可以輕松找到和修改程序的特定部分,而不用擔(dān)心對(duì)其他部分的影響。靈活性和擴(kuò)展性:OOP的封裝和多態(tài)特性使得程序可以靈活地應(yīng)對(duì)需求的變化和擴(kuò)展,而不需要大幅修改現(xiàn)有代碼。知識(shí)儲(chǔ)備—類與對(duì)象1.類的定義類是對(duì)象的模板或藍(lán)圖。你可以把類看作是定義了一類對(duì)象的共同特性和行為。對(duì)象是類的實(shí)例。例如,“狗”是一個(gè)類,它描述了所有狗的共同特性(如顏色、品種)和行為(如叫聲、奔跑)。而具體的一只“哈士奇”狗就是“狗”類的一個(gè)實(shí)例對(duì)象。知識(shí)儲(chǔ)備—類與對(duì)象1.類的定義在面向?qū)ο蟮某绦蚴澜缋?,每個(gè)類都擁有專屬的標(biāo)識(shí)名稱,如同給這個(gè)“模板”貼上了獨(dú)特的標(biāo)簽。它的構(gòu)成包含兩部分核心內(nèi)容:一部分是用于刻畫自身特征的數(shù)據(jù),這些數(shù)據(jù)被稱作“屬性”,就像人的身高、體重一樣,定義了類的基本狀態(tài);另一部分是用于描述自身能執(zhí)行的操作的函數(shù),這些函數(shù)被稱作“方法”,好比人能跑、能跳的動(dòng)作,決定了類可以完成的具體行為。知識(shí)儲(chǔ)備—類與對(duì)象1.類的定義Python使用關(guān)鍵字class來(lái)定義一個(gè)類,基本的語(yǔ)法格式如下:class類名:

屬性名=屬性值

def方法名(self,參數(shù)1,參數(shù)2,...):方法體語(yǔ)法格式class作為專用關(guān)鍵字,標(biāo)志著一個(gè)類定義的起始;類名是該類的唯一標(biāo)識(shí),命名需遵循“大駝峰命名法”——即每個(gè)單詞首字母大寫(如BookStore、UserAccount),這是Python社區(qū)約定的規(guī)范,便于區(qū)分類與其他標(biāo)識(shí)符;類名之后必須添加冒號(hào):,它如同一個(gè)“分隔符”,將類的聲明部分與具體實(shí)現(xiàn)內(nèi)容區(qū)分開來(lái)。冒號(hào)之后的代碼需通過(guò)縮進(jìn)(通常為4個(gè)空格)形成代碼塊,在這個(gè)塊中定義類的核心組成:屬性和方法。一個(gè)類中屬性和方法的數(shù)量沒(méi)有固定限制,既可以只包含屬性、只包含方法,也可以兩者都包含。知識(shí)儲(chǔ)備—類與對(duì)象1.類的定義【示例1】定義一個(gè)狗類(Dog),該類具有一些基本屬性(如昵稱、品種、性別),以及一些行為(如發(fā)出叫聲、搖尾巴、進(jìn)食),示例代碼如下:classDog:name="小黑“ #定義昵稱屬性

breed="哈士奇" #定義品種屬性

gender="母“ #定義性別屬性

defshout(self): #定義發(fā)出叫聲方法

print("汪汪汪!")defwag_tail(self): #定義搖尾巴方法

print("搖著尾巴,看起來(lái)很開心!")defeat(self,food): #定義進(jìn)食方法

print(f"正在{food},滿足地舔了舔嘴。")知識(shí)儲(chǔ)備—類與對(duì)象2.對(duì)象的創(chuàng)建與使用類定義完成后并不能直接投入使用,這就像一張?jiān)敱M的汽車設(shè)計(jì)圖紙:圖紙能清晰呈現(xiàn)汽車的構(gòu)造細(xì)節(jié)與各項(xiàng)功能,卻無(wú)法直接讓用戶駕駛出行;若要滿足實(shí)際使用需求,必須依據(jù)圖紙生產(chǎn)出真實(shí)的汽車。對(duì)象(Object)是類的具體實(shí)例,是根據(jù)類這個(gè)模板創(chuàng)建出來(lái)的實(shí)體。在Python中,通過(guò)調(diào)用類名并傳遞必要的參數(shù),可以創(chuàng)建類的實(shí)例,這個(gè)過(guò)程稱為實(shí)例化。創(chuàng)建對(duì)象的語(yǔ)法格式如下所示:對(duì)象名=類名()語(yǔ)法格式知識(shí)儲(chǔ)備—類與對(duì)象dog=Dog()Python中可以通過(guò)對(duì)象名訪問(wèn)對(duì)象的屬性和方法,語(yǔ)法格式如下所示:對(duì)象名.屬性名 #訪問(wèn)屬性對(duì)象名.方法名(參數(shù)1,參數(shù)2,...) #調(diào)用方法語(yǔ)法格式2.對(duì)象的創(chuàng)建與使用例如,根據(jù)上例定義的Dog類創(chuàng)建一個(gè)對(duì)象,代碼如下:知識(shí)儲(chǔ)備—類與對(duì)象2.對(duì)象的創(chuàng)建與使用例如,使用dog對(duì)象訪問(wèn)name、breed、gender屬性,以及調(diào)用shout()、wag_tail()、eat()方法,代碼如下:print() #訪問(wèn)name屬性print(dog.breed) #訪問(wèn)breed屬性print(dog.gender) #訪問(wèn)gender屬性dog.shout() #調(diào)用shout方法dog.wag_tail() #調(diào)用wag_tail方法dog.eat('骨頭’) #調(diào)用eat方法知識(shí)儲(chǔ)備—類與對(duì)象self指代調(diào)用該方法的對(duì)象本身。self不是關(guān)鍵詞,可以定義成a或b或其它名字self類的方法必須有個(gè)額外的第一個(gè)參數(shù)(self),但在調(diào)用這個(gè)方法的時(shí)候不必為這個(gè)參數(shù)賦值。類的方法和普通函數(shù)的區(qū)別知識(shí)儲(chǔ)備—屬性屬性是類的“特征載體”,用來(lái)刻畫類或其實(shí)例的狀態(tài)——就像描述一個(gè)事物時(shí),既要有它所屬群體的共性特征,也要有個(gè)體獨(dú)有的特性。按照作用范圍,屬性可分為兩類:類屬性和實(shí)例屬性,前者歸整個(gè)類所有,后者則屬于類實(shí)例化后的具體對(duì)象。知識(shí)儲(chǔ)備—屬性1.類屬性類屬性指的是定義在類內(nèi)部、方法外部的屬性。類屬性是屬于類本身的屬性,所有類的實(shí)例共享該屬性的值。例如,前面示例中Dog類內(nèi)部定義的name屬性和breed屬性就是類屬性。2.實(shí)例屬性實(shí)例屬性指的是在類的方法內(nèi)部,通過(guò)“self.屬性名”定義的屬性,最常見(jiàn)的是在__init__()方法中定義(也可在其他方法中添加)。實(shí)例屬性是屬于每個(gè)實(shí)例對(duì)象獨(dú)有的屬性,不同實(shí)例的實(shí)例屬性可以有不同的值。知識(shí)儲(chǔ)備—屬性【示例2】定義一個(gè)貓類(Cat),該類具有性別、品種兩個(gè)類屬性,具有昵稱、年齡兩個(gè)實(shí)例屬性,示例代碼如下:classCat:gender="母“ #定義性別類屬性

breed="布偶貓“ #定義品種類屬性

def__init__(self,name,age):=name #定義昵稱實(shí)例屬性

self.age=age #定義年齡實(shí)例屬性知識(shí)儲(chǔ)備—屬性類屬性可以通過(guò)類或?qū)ο筮M(jìn)行訪問(wèn),實(shí)例屬性只能通過(guò)對(duì)象進(jìn)行訪問(wèn)。例如,訪問(wèn)Cat類的類屬性和實(shí)例屬性,代碼如下:cat=Cat("灰灰",1) #創(chuàng)建對(duì)象catprint(Cat.breed,Cat.gender) #通過(guò)類Cat訪問(wèn)類屬性print(cat.breed,cat.gender) #通過(guò)對(duì)象cat訪問(wèn)類屬性print(,cat.age) #通過(guò)對(duì)象cat訪問(wèn)實(shí)例屬性print(C,Cat.age) #通過(guò)類Cat訪問(wèn)實(shí)例屬性,會(huì)報(bào)錯(cuò)知識(shí)儲(chǔ)備—屬性類屬性只能通過(guò)類進(jìn)行修改,實(shí)例屬性只能通過(guò)對(duì)象進(jìn)行修改。例如,修改Cat類的類屬性和實(shí)例屬性,代碼如下:Cat.gender="公“ #通過(guò)類Cat修改類屬性cat.breed="橘貓“ #通過(guò)對(duì)象cat修改類屬性C="花花“ #通過(guò)類Cat修改類屬性cat.age=10 #通過(guò)對(duì)象cat修改類屬性print(Cat.breed,Cat.gender)print(,cat.age)知識(shí)儲(chǔ)備—屬性為什么通過(guò)對(duì)象cat修改后的breed屬性值為“布偶貓”?通過(guò)類Cat修改后的name屬性值為“灰灰”?程序之所以出現(xiàn)這個(gè)問(wèn)題,是因?yàn)榇a“cat.breed="橘貓"”的實(shí)際作用是添加了一個(gè)與類屬性同名的實(shí)例屬性,代碼“C="花花"”實(shí)際是添加了一個(gè)與實(shí)例屬性同名的類屬性。知識(shí)儲(chǔ)備—屬性Python支持在類的外部動(dòng)態(tài)的添加類屬性和實(shí)例屬性。例如,在以上示例的末尾添加如下代碼:print(cat.breed)print(C)動(dòng)態(tài)地添加實(shí)例屬性color,增加的代碼如下:cat.color="紅色“ #動(dòng)態(tài)地添加實(shí)例屬性print(cat.color)需要注意的是,動(dòng)態(tài)添加的實(shí)例屬性只會(huì)影響到指定的對(duì)象,而不會(huì)影響其他對(duì)象。例如,在以上示例的末尾再次創(chuàng)建一個(gè)Cat類的對(duì)象,通過(guò)該對(duì)象訪問(wèn)前面動(dòng)態(tài)添加的實(shí)例屬性color,具體代碼如下。cat2=Cat() #創(chuàng)建另一個(gè)對(duì)象print(cat2.color) #嘗試用另一個(gè)對(duì)象訪問(wèn)動(dòng)態(tài)添加的實(shí)例屬性知識(shí)儲(chǔ)備—方法方法是類的“行為載體”,用來(lái)展現(xiàn)類或其實(shí)例能執(zhí)行的操作——就像人有跑、跳等動(dòng)作,類的方法定義了它能完成的具體功能。在Python中,根據(jù)定義方式和適用場(chǎng)景,方法主要分為三類:實(shí)例方法、類方法和靜態(tài)方法。1.實(shí)例方法實(shí)例方法是類中最常用的方法類型,形式上類似函數(shù),但必須定義在類內(nèi)部,且第一個(gè)參數(shù)固定為self。例如,前面Dog類中定義的bark就是一個(gè)實(shí)例方法。實(shí)例方法只能由實(shí)例化后的對(duì)象來(lái)調(diào)用,無(wú)法直接通過(guò)類名調(diào)用?!臼纠?】定義一個(gè)包含實(shí)例方法fly()的鳥類(Bird),創(chuàng)建Bird類的對(duì)象,分別通過(guò)對(duì)象和類調(diào)用實(shí)例方法,示例代碼如下:classBird:deffly(self):print("我是實(shí)例方法")bird=Bird()bird.fly() #通過(guò)對(duì)象調(diào)用實(shí)例方法Bird.fly() #通過(guò)類調(diào)用實(shí)例方法,會(huì)報(bào)錯(cuò)知識(shí)儲(chǔ)備—方法1.實(shí)例方法通過(guò)self,實(shí)例方法可以訪問(wèn)實(shí)例屬性或者調(diào)用實(shí)例方法。例如,在Bird類中定義實(shí)例屬性和另一個(gè)實(shí)例方法,并在fly()方法內(nèi)部通過(guò)self參數(shù)訪問(wèn)實(shí)例屬性以及調(diào)用實(shí)例方法,修改后的代碼如下classBird:deffly(self):print("我是實(shí)例方法")self.create_arr() #通過(guò)self調(diào)用其他實(shí)例方法

print(self.color) #通過(guò)self訪問(wèn)實(shí)例屬性

defcreate_arr(self): #定義其他實(shí)例方法

self.color="紅色“ #定義實(shí)例屬性bird=Bird()bird.fly() #通過(guò)對(duì)象調(diào)用實(shí)例方法知識(shí)儲(chǔ)備—方法2.類方法類方法是定義在類內(nèi)部、使用裝飾器@classmethod修飾的方法,定義類方法的語(yǔ)法格式如下所示:@classmethoddef類方法名(cls,參數(shù)1,參數(shù)2,...):

方法體語(yǔ)法格式裝飾器@classmethod用于標(biāo)識(shí)類方法;與實(shí)例方法的self不同,類方法的第一個(gè)參數(shù)固定為cls(名稱約定使用cls,可理解為“class”的縮寫),它自動(dòng)指向調(diào)用該方法的類本身。當(dāng)通過(guò)類名調(diào)用類方法時(shí),cls會(huì)被自動(dòng)賦值為這個(gè)類,無(wú)需開發(fā)者手動(dòng)傳遞。知識(shí)儲(chǔ)備—方法2.類方法例如,在Bird類中添加一個(gè)類方法forage(),具體代碼如下:類方法的核心特性在于它與類本身直接綁定,而非依賴于類的某個(gè)實(shí)例對(duì)象。這就使得無(wú)需實(shí)例化對(duì)象,直接通過(guò)類名就能調(diào)用類方法。不過(guò),類方法也支持通過(guò)對(duì)象調(diào)用,示例代碼如下:@classmethoddefforage(cls):print("我是類方法")bird.forage() #通過(guò)對(duì)象調(diào)用類方法Bird.forage() #通過(guò)類調(diào)用類方法知識(shí)儲(chǔ)備—方法2.類方法類方法中可以使用cls訪問(wèn)和修改類屬性的值。例如,在Bird類添加一個(gè)類屬性name,并在類方法forage()中訪問(wèn)和修改該屬性,具體代碼如下:name="阿飛"@classmethoddefforage(cls):print()="飛飛"print()知識(shí)儲(chǔ)備—方法3.靜態(tài)方法靜態(tài)方法是定義在類內(nèi)部、使用裝飾器@staticmethod修飾的方法,定義靜態(tài)方法的語(yǔ)法格式如下所示:@staticmethoddef靜態(tài)方法名(參數(shù)1,參數(shù)2,...):

方法體語(yǔ)法格式例如,在Bird類中添加一個(gè)包靜態(tài)方法test(),具體代碼如下:知識(shí)儲(chǔ)備—方法@staticmethoddeftest(): #定義靜態(tài)方法

print("我是靜態(tài)方法")3.靜態(tài)方法靜態(tài)方法是類中一種特殊的方法,它既不依賴于實(shí)例對(duì)象(沒(méi)有self參數(shù)),也不綁定于類本身(沒(méi)有cls參數(shù))。靜態(tài)方法既可以通過(guò)類名直接調(diào)用,也可以通過(guò)實(shí)例對(duì)象調(diào)用,效果相同。但更推薦通過(guò)類名直接調(diào)用。例如,通過(guò)Bird類調(diào)用靜態(tài)方法,具體代碼如下:知識(shí)儲(chǔ)備—方法Bird.test() #通過(guò)類調(diào)用靜態(tài)方法3.靜態(tài)方法靜態(tài)方法中不能直接訪問(wèn)屬性或調(diào)用方法,但可以使用類名訪問(wèn)類屬性或調(diào)用類方法,修改后的代碼如下:知識(shí)儲(chǔ)備—方法@staticmethoddeftest(): #定義靜態(tài)方法

print("我是靜態(tài)方法")print(f"類屬性的值為{B}") #在靜態(tài)方法中訪問(wèn)類屬性下面分別從定義方式、默認(rèn)參數(shù)、操作限制、調(diào)用方式這4個(gè)方面歸納總結(jié)這幾個(gè)方法的特點(diǎn),具體如下表所示。方面實(shí)例方法類方法靜態(tài)方法定義方式類內(nèi)用def直接定義,無(wú)需裝飾器類內(nèi)用def定義,需加@classmethod裝飾器類內(nèi)用def定義,需加@staticmethod裝飾器默認(rèn)參數(shù)第一個(gè)參數(shù)為self,指代調(diào)用該方法的對(duì)象第一個(gè)參數(shù)為cls,指代調(diào)用該方法的類無(wú)默認(rèn)特殊參數(shù)(無(wú)需self或cls)操作限制可通過(guò)self訪問(wèn)/修改實(shí)例屬性、調(diào)用實(shí)例方法可通過(guò)cls訪問(wèn)/修改類屬性、調(diào)用其他類方法不可訪問(wèn)實(shí)例屬性、調(diào)用實(shí)例方法;可通過(guò)類名訪問(wèn)類屬性、調(diào)用類方法調(diào)用方式僅能通過(guò)實(shí)例對(duì)象調(diào)用可通過(guò)類名或?qū)嵗龑?duì)象調(diào)用推薦通過(guò)類名調(diào)用(技術(shù)上可通過(guò)對(duì)象調(diào)用,但易造成混淆)知識(shí)儲(chǔ)備—方法知識(shí)儲(chǔ)備—私有成員在Python中,私有成員是一種用于封裝類的數(shù)據(jù)和方法的機(jī)制。私有成員只能在類內(nèi)部訪問(wèn),無(wú)法從類的外部直接訪問(wèn)。默認(rèn)狀態(tài)下,類的成員如同敞開的空間,無(wú)論是類內(nèi)部的代碼,還是類外部的程序,都能直接訪問(wèn)、修改這些成員(包括屬性和方法),這種無(wú)限制的訪問(wèn)權(quán)限被稱為“公有訪問(wèn)權(quán)限”。但這種“完全開放”的狀態(tài)可能埋下隱患:比如外部代碼隨意修改類的核心屬性,可能導(dǎo)致類的狀態(tài)混亂;或者誤調(diào)用本應(yīng)僅在類內(nèi)部協(xié)調(diào)工作的方法,破壞程序的邏輯一致性。為了規(guī)避這類風(fēng)險(xiǎn),提高類的安全性,可以將類的成員設(shè)置為“私有成員”。私有成員如同加了鎖的專屬區(qū)域,只能在類的內(nèi)部被訪問(wèn)、修改或調(diào)用,徹底限制了外部程序的隨意操作,從而確保類的核心數(shù)據(jù)和邏輯不會(huì)被意外干擾,讓類的功能更穩(wěn)定可靠。Python通過(guò)在類成員的名稱前面添加雙下畫線(__)的方式來(lái)表示私有成員,語(yǔ)法格式如下:__屬性名__方法名語(yǔ)法格式知識(shí)儲(chǔ)備—私有成員私有成員在類的內(nèi)部可以直接被訪問(wèn)或調(diào)用,而在類的外部不能直接訪問(wèn)或調(diào)用,但可以通過(guò)定義公有方法(即外部可直接調(diào)用的方法)作為“橋梁”,在類外部借助這些公有方法間接訪問(wèn)私有成員?!臼纠?】定義一個(gè)包含私有屬性__wing和私有方法__fly()的類Bird,代碼如下:知識(shí)儲(chǔ)備—私有成員classBird:__wing=2 #私有屬性

def__fly(self): #私有方法

print("飛行")

bird=Bird()print(bird.__wing) #在類外部訪問(wèn)私有屬性,會(huì)報(bào)錯(cuò)bird.__fly() #在類外部調(diào)用私有方法,會(huì)報(bào)錯(cuò)在以上定義的Bird類中增加一個(gè)公有方法test(),并在公有方法test()中訪問(wèn)私有屬性__wing、調(diào)用私有方法__fly(),修改后的代碼如下:類的私有成員只能在類的內(nèi)部直接訪問(wèn)或調(diào)用,但可以在類的外部通過(guò)類的公有方法間接訪問(wèn)或調(diào)用私有成員。classBird:__wing=2 #私有屬性

def__fly(self): #私有方法

print("飛行")deftest(self):print(f"鳥有{self.__wing}個(gè)翅膀") #在公有方法中訪問(wèn)私有屬性

self.__fly() #在公有方法中調(diào)用私有方法bird=Bird()bird.test()知識(shí)儲(chǔ)備—私有成員知識(shí)儲(chǔ)備—構(gòu)造方法構(gòu)造方法,即__init__()方法,是類中承擔(dān)對(duì)象初始化職責(zé)的特殊方法。其核心功能是在對(duì)象創(chuàng)建過(guò)程中自動(dòng)執(zhí)行初始化操作,例如為對(duì)象的屬性賦予初始值等,類似于工業(yè)生產(chǎn)中產(chǎn)品下線前的基礎(chǔ)配置環(huán)節(jié),確保對(duì)象在創(chuàng)建時(shí)即具備必要的初始狀態(tài)。構(gòu)造方法的定義和實(shí)例方法很像,都用def關(guān)鍵字定義在類內(nèi)部,且第一個(gè)參數(shù)通常是self(指代被初始化的對(duì)象);不同的是,它的名稱是固定的__init__。定義構(gòu)造方法的語(yǔ)法格式如下:def__init__(self,參數(shù)1,參數(shù)2,...):方法體語(yǔ)法格式知識(shí)儲(chǔ)備—構(gòu)造方法每個(gè)類都有一個(gè)默認(rèn)的構(gòu)造方法,如果定義一個(gè)類時(shí)沒(méi)有顯式定義構(gòu)造方法,那么Python解釋器會(huì)自動(dòng)調(diào)用默認(rèn)的構(gòu)造方法。如果在定義一個(gè)類時(shí)顯式地定義了構(gòu)造方法,則創(chuàng)建對(duì)象時(shí)Python解釋器會(huì)優(yōu)先調(diào)用顯式定義的構(gòu)造方法。根據(jù)參數(shù)(self除外)的有無(wú),構(gòu)造方法可以分為有參構(gòu)造方法和無(wú)參構(gòu)造方法。無(wú)參構(gòu)造方法:無(wú)參構(gòu)造方法是不接受任何參數(shù)(self除外)的構(gòu)造方法,用于創(chuàng)建具有默認(rèn)狀態(tài)的對(duì)象。如果在類中沒(méi)有顯式定義構(gòu)造方法,則會(huì)使用默認(rèn)的無(wú)參構(gòu)造方法。有參構(gòu)造方法:有參構(gòu)造方法是接受一個(gè)或多個(gè)參數(shù)(self除外)的構(gòu)造方法,用于在創(chuàng)建對(duì)象時(shí),能夠根據(jù)外部傳入的具體參數(shù)值,靈活地對(duì)屬性進(jìn)行初始化。這類方法可根據(jù)實(shí)際需求定義多種參數(shù)形式(如不同數(shù)量、不同類型的參數(shù)),從而滿足對(duì)象初始化時(shí)的個(gè)性化需求。知識(shí)儲(chǔ)備—構(gòu)造方法創(chuàng)建對(duì)象時(shí)會(huì)自動(dòng)調(diào)用相應(yīng)的構(gòu)造方法。如果調(diào)用的構(gòu)造方法是有參構(gòu)造方法,那么在創(chuàng)建對(duì)象時(shí)需要傳入相應(yīng)的參數(shù),具體格式如下。對(duì)象名=類名(參數(shù)1,參數(shù)2,...)語(yǔ)法格式當(dāng)使用無(wú)參構(gòu)造方法創(chuàng)建多個(gè)對(duì)象時(shí),由于構(gòu)造方法為屬性設(shè)定的是固定默認(rèn)值,這些對(duì)象的屬性會(huì)天然攜帶相同的初始值。而使用有參構(gòu)造方法創(chuàng)建對(duì)象時(shí),可在創(chuàng)建過(guò)程中向構(gòu)造方法傳入不同參數(shù),構(gòu)造方法會(huì)將這些參數(shù)值直接賦給屬性作為初始值。因此,通過(guò)傳入不同參數(shù),能讓每個(gè)對(duì)象的屬性擁有差異化的初始值。知識(shí)儲(chǔ)備—構(gòu)造方法【示例5】定義一個(gè)包含無(wú)參構(gòu)造方法和實(shí)例方法bark()的狗類(Dog),創(chuàng)建兩個(gè)Dog類的對(duì)象dog1和dog2,通過(guò)對(duì)象dog1和dog2調(diào)用bark()方法,示例代碼如下:知識(shí)儲(chǔ)備—構(gòu)造方法classDog:def__init__(self): #無(wú)參構(gòu)造方法

self.color="黑色"defbark(self):print(f"狗狗的顏色為:{self.color}")dog1=Dog() #創(chuàng)建對(duì)象并初始化dog1.bark()dog2=Dog() #創(chuàng)建對(duì)象并初始化dog2.bark()【示例6】定義一個(gè)包含有參構(gòu)造方法和實(shí)例方法bark()的狗類(Dog),創(chuàng)建Dog類的對(duì)象dog1和dog2,通過(guò)對(duì)象dog1和dog2調(diào)用bark()方法,示例代碼如下:知識(shí)儲(chǔ)備—構(gòu)造方法classDog:def__init__(self,color): #有參構(gòu)造方法

self.color=color #將形參color賦值給屬性

defbark(self):print(f"狗狗的顏色為:{self.color}")dog1=Dog("黑色") #創(chuàng)建對(duì)象,并根據(jù)實(shí)參初始化屬性dog1.bark()dog2=Dog("白色") #創(chuàng)建對(duì)象,并根據(jù)實(shí)參初始化屬性dog2.bark()案例實(shí)現(xiàn)創(chuàng)建名稱為“智慧圖書借閱管理系統(tǒng)”的項(xiàng)目,在項(xiàng)目下創(chuàng)建名稱為borrow_system的Python文件。準(zhǔn)備工作案例實(shí)現(xiàn)STEP01定義圖書類(Book)創(chuàng)建一個(gè)表示圖書的類,包含圖書的基本信息和借閱狀態(tài),同時(shí)提供借閱和歸還圖書的方法。(1)類定義與屬性初始化在__init__()方法中,定義圖書的基本信息,如書名、作者、出版社、ISBN,并初始化借閱狀態(tài)為未借出。classBook:def__init__(self,title,author,publisher,isbn):self.title=title #名稱

self.author=author #作者

self.publisher=publisher #出版社

self.isbn=isbn #唯一標(biāo)識(shí)

self.is_borrowed=False #借閱狀態(tài)

self.borrower=None #借閱人

self.borrow_date=None #借閱日期案例實(shí)現(xiàn)STEP02定義圖書類(Book)(2)借閱圖書方法borrow()方法接收借閱人和借閱日期作為參數(shù),檢查圖書是否已借出。若已借出,返回失敗信息;若未借出,更新圖書的借閱狀態(tài)。defborrow(self,borrower,date):ifself.is_borrowed:returnFalse,f"圖書《{self.title}》已被借出"self.is_borrowed=Trueself.borrower=borrowerself.borrow_date=datereturnTrue,f"成功借閱《{self.title}》"案例實(shí)現(xiàn)STEP03定義圖書類(Book)(3)歸還圖書方法return_book()方法檢查圖書是否已借出。若未借出,返回失敗信息;若已借出,更新圖書的借閱狀態(tài)為未借出。defreturn_book(self):ifnotself.is_borrowed:returnFalse,f"圖書《{self.title}》未被借出"self.is_borrowed=Falseself.borrower=Noneself.borrow_date=NonereturnTrue,f"成功歸還《{self.title}》"案例實(shí)現(xiàn)STEP04定義圖書類(Book)(4)圖書信息字符串格式化__str__()方法返回圖書的基本信息和借閱狀態(tài),便于調(diào)試和展示。def__str__(self):status="已借出"ifself.is_borrowedelse"可借閱"returnf"《{self.title}》-{self.author}-{self.publisher}-{self.isbn}-{status}"案例實(shí)現(xiàn)STEP05定義圖書館類(Library)創(chuàng)建一個(gè)表示圖書館的類,管理圖書集合,提供添加、刪除、查詢、借閱和歸還圖書的方法。(1)初始化與圖書信息存儲(chǔ)在__init__()方法中,初始化圖書館的名稱和圖書集合,使用ISBN作為鍵存儲(chǔ)圖書。classLibrary:def__init__(self,name):=nameself.books={} #使用ISBN作為鍵案例實(shí)現(xiàn)STEP06定義圖書類(Book)(2)添加圖書方法add_book()方法檢查圖書的ISBN是否已存在。若存在,返回失敗信息;若不存在,將圖書添加到圖書集合中。defadd_book(self,book):ifbook.isbninself.books:returnFalse,f"ISBN為{book.isbn}的圖書已存在"self.books[book.isbn]=bookreturnTrue,f"成功添加《{book.title}》"案例實(shí)現(xiàn)STEP07定義圖書類(Book)(3)查詢圖書方法find_book()方法支持書名、作者、ISBN的模糊匹配,返回符合條件的圖書列表。deffind_book(self,query):results=[]forbookinself.books.values():if(query.lower()inbook.title.lower()orquery.lower()inbook.author.lower()orquery==book.isbn):results.append(book)returnresults案例實(shí)現(xiàn)STEP08定義圖書類(Book)(4)借閱與歸還方法borrow_book()和return_book()方法分別調(diào)用圖書類的borrow()和return_book()方法,實(shí)現(xiàn)圖書的借閱和歸還。defborrow_book(self,isbn,borrower,date):ifisbnnotinself.books:returnFalse,f"ISBN為{isbn}的圖書不存在"returnself.books[isbn].borrow(borrower,date)defreturn_book(self,isbn):ifisbnnotinself.books:returnFalse,f"ISBN為{isbn}的圖書不存在"returnself.books[isbn].return_book()案例實(shí)現(xiàn)STEP09定義圖書類(Book)(5)統(tǒng)計(jì)方法get_total_books()方法返回圖書館的圖書總數(shù),get_available_books()方法返回可借閱的圖書列表。defget_total_books(self):returnlen(self.books)defget_available_books(self):return[bookforbookinself.books.values()ifnotbook.is_borrowed]案例實(shí)現(xiàn)STEP10定義圖書管理系統(tǒng)界面類(LibrarySystem)創(chuàng)建一個(gè)表示圖書管理系統(tǒng)界面的類,提供菜單顯示和系統(tǒng)運(yùn)行的方法。(1)初始化在__init__()方法中,初始化圖書館對(duì)象并預(yù)設(shè)圖書信息。classLibrarySystem:def__init__(self):self.library=Library("智慧圖書館")#預(yù)設(shè)圖書數(shù)據(jù)

self._initialize_classic_books()def_initialize_classic_books(self):"""初始化圖書信息"""classic_books=[Book("紅樓夢(mèng)","曹雪芹","人民文學(xué)出版社","9787020001757"),…]forbookinclassic_books:self.library.add_book(book)案例實(shí)現(xiàn)STEP11定義圖書管理系統(tǒng)界面類(LibrarySystem)(2)菜單顯示方法display_menu()方法顯示系統(tǒng)的菜單選項(xiàng)。defdisplay_menu(self):"""顯示菜單"""print("\n"+"="*40)print(f"{'智慧圖書借閱管理系統(tǒng)':^40}")print("="*40)print("1.查詢圖書")print("2.借閱圖書")print("3.歸還圖書")print("4.查看所有圖書")print("5.統(tǒng)計(jì)圖書數(shù)量")print("0.退出系統(tǒng)")print("="*40)案例實(shí)現(xiàn)STEP12定義圖書管理系統(tǒng)界面類(LibrarySystem)(3)系統(tǒng)運(yùn)行方法run()方法使用whileTrue循環(huán)持續(xù)接收用戶輸入,根據(jù)用戶的選擇調(diào)用相應(yīng)的方法。defrun(self):"""運(yùn)行系統(tǒng)"""whileTrue:self.display_menu()choice=input("請(qǐng)選擇功能:")ifchoice=="1":self.find_book()elifchoice=="2":self.borrow_book()…else:print("無(wú)效的選擇,請(qǐng)重新輸入!")案例實(shí)現(xiàn)STEP13定義圖書管理系統(tǒng)界面類(LibrarySystem)(4)交互方法find_book()、borrow_book()、return_book()、show_all_books()和show_total_books()方法分別實(shí)現(xiàn)查詢、借閱、歸還圖書、顯示所有圖書和圖書總數(shù)的交互功能。deffind_book(self):"""查找圖書交互""“…defborrow_book(self):"""借閱圖書交互""“…defreturn_book(self):"""歸還圖書交互""“…案例實(shí)現(xiàn)STEP13定義圖書管理系統(tǒng)界面類(LibrarySystem)(4)交互方法find_book()、borrow_book()、return_book()、show_all_books()和show_total_books()方法分別實(shí)現(xiàn)查詢、借閱、歸還圖書、顯示所有圖書和圖書總數(shù)的交互功能。defshow_all_books(self):"""顯示所有圖書"""…defshow_total_books(self):"""顯示圖書總數(shù)"""

案例實(shí)現(xiàn)STEP14程序執(zhí)行入口添加程序執(zhí)行入口。使用if__name__=="__main__"確保代碼作為腳本運(yùn)行時(shí)才執(zhí)行,創(chuàng)建LibrarySystem對(duì)象并調(diào)用run()方法啟動(dòng)系統(tǒng)。if__name__=="__main__":system=LibrarySystem()system.run()【案例7-2】幾何圖形計(jì)算器02案例分析幾何圖形計(jì)算器是一款專注于幾何計(jì)算的實(shí)用工具,可快速準(zhǔn)確地完成矩形、正方形、圓形等常見(jiàn)圖形的面積與周長(zhǎng)計(jì)算。用戶只需輸入相應(yīng)圖形的關(guān)鍵參數(shù)(如矩形的長(zhǎng)寬、圓的半徑),即可獲得精確計(jì)算結(jié)果,同時(shí)支持以標(biāo)準(zhǔn)化格式輸出圖形的完整描述信息。工具采用模塊化架構(gòu)設(shè)計(jì),鼓勵(lì)用戶自主擴(kuò)展功能(如添加新圖形類型),在實(shí)踐中培養(yǎng)探索精神與創(chuàng)新意識(shí),實(shí)現(xiàn)計(jì)算工具從知識(shí)載體到文化傳承紐帶的升華。知識(shí)儲(chǔ)備封裝繼承方法重寫知識(shí)儲(chǔ)備知識(shí)儲(chǔ)備—封裝封裝(Encapsulation)是面向?qū)ο缶幊痰暮诵奶匦灾?,它的基本思想是將?duì)象的屬性和方法隱藏在類內(nèi)部,只暴露必要的接口給外部使用。類的使用者無(wú)需知道類的實(shí)現(xiàn)細(xì)節(jié),只需要使用公開接口便可訪問(wèn)類的內(nèi)容,這有助于確保數(shù)據(jù)的安全性和代碼的可維護(hù)性。例如,銀行賬戶的余額屬性可以封裝在類內(nèi)部,防止外部代碼直接修改,只有通過(guò)存款和取款的方法才能改變余額。在Python中實(shí)現(xiàn)封裝可以分為兩步:(1)將屬性聲明為私有屬性。(2)給私有屬性添加兩個(gè)供外界調(diào)用的公有方法,分別用于設(shè)置或獲取私有屬性的值。知識(shí)儲(chǔ)備—封裝【示例7】使用封裝的思想定義一個(gè)狗類(Dog),該類具有兩個(gè)私有屬性及用于設(shè)置或獲取值的公有方法,示例代碼如下:classDog:def__init__(self):self.__name="“ #私有屬性

self.__age="“ #私有屬性

defset_name(self,name): #設(shè)置私有屬性__name的值的方法

self.__name=namedefget_name(self): #獲取私有屬性__name的值的方法

returnself.__namedefset_age(self,age): #設(shè)置私有屬性__age的值的方法

self.__age=agedefget_age(self): #獲取私有屬性__age的值的方法

returnself.__age知識(shí)儲(chǔ)備—封裝【示例7】創(chuàng)建Dog類的對(duì)象dog,通過(guò)dog對(duì)象調(diào)用set_name()方法,將__name屬性的值設(shè)置為“小黑”,調(diào)用set_age()方法,將__age屬性的值設(shè)置為5,然后通過(guò)dog對(duì)象分別調(diào)用get_name()方法和get_age()方法獲取私有屬性的值,代碼如下:dog=Dog()#通過(guò)公有方法訪問(wèn)和修改私有屬性dog.set_name("小黑")dog.set_age(5)print(f'狗狗的昵稱為{dog.get_name()},今年{dog.get_age()}歲了')知識(shí)儲(chǔ)備—封裝知識(shí)儲(chǔ)備—繼承繼承(Inheritance)是面向?qū)ο缶幊痰暮诵奶匦灾?。在現(xiàn)實(shí)生活中,繼承一般指的是子女繼承父輩的財(cái)產(chǎn)。在程序中,繼承描述的是事物之間的所屬關(guān)系,例如貓和狗都屬于動(dòng)物,程序中便可以描述為貓和狗繼承自動(dòng)物;同理,波斯貓和巴厘貓都繼承自貓,而沙皮狗和斑點(diǎn)狗都繼承狗在Python中,繼承就是允許一個(gè)類(稱為子類或派生類)繼承另一個(gè)類(稱為父類或基類)的屬性和方法。子類可以繼承父類的特性,并且可以在此基礎(chǔ)上添加自己的新特性。繼承可以減少代碼的重復(fù),讓類之間建立層次關(guān)系。1.單繼承2.多繼承知識(shí)儲(chǔ)備—繼承1.單繼承單繼承即子類只繼承一個(gè)父類?,F(xiàn)實(shí)生活中,狗類、貓類、鳥類都屬于動(dòng)物類,它們之間存在的繼承關(guān)系即為單繼承。Python中單繼承的語(yǔ)法格式如下:知識(shí)儲(chǔ)備—繼承class子類名(父類名):……語(yǔ)法格式子類繼承父類的同時(shí)會(huì)自動(dòng)擁有父類的公有成員。若在定義類時(shí)不指明該類的父類,那么該類默認(rèn)繼承基類object。1.單繼承【示例8】定義一個(gè)動(dòng)物類(Animal)和一個(gè)繼承Animal類的狗類(Dog)和貓類(Cat),示例代碼如下:#定義動(dòng)物類classAnimal:…#定義狗類并繼承動(dòng)物類classDog(Animal):defbark(self):print("汪汪叫")#定義貓類并繼承動(dòng)物類classCat(Animal):defcatch(self):print("抓老鼠")知識(shí)儲(chǔ)備—繼承1.單繼承【示例8】(續(xù))dog=Dog("小黑","拉布拉多") #創(chuàng)建Dog子類的對(duì)象print(f"{}是一只{dog.breed}狗狗") #子類訪問(wèn)從父類繼承的屬性dog.eat() #子類調(diào)用從父類繼承的方法dog.bark() #子類調(diào)用自己特有的方法cat=Cat("灰灰","橘貓") #創(chuàng)建Cat子類的對(duì)象print(f"{}是一只{cat.breed}貓咪") #子類訪問(wèn)從父類繼承的屬性cat.eat() #子類調(diào)用從父類繼承的方法cat.catch() #子類調(diào)用自己特有的方法知識(shí)儲(chǔ)備—繼承1.單繼承需要注意的是,子類不會(huì)擁有父類的私有成員,也不能訪問(wèn)父類的私有成員。在以上示例的Animal類中增加一個(gè)私有屬性__gender和一個(gè)私有方法__test(),修改后Animal類的代碼如下:classAnimal:def__init__(self,name,breed):=nameself.breed=breedself.__gender="母" #增加私有屬性

defeat(self):print("吃")def__test(self): #增加私有方法

print("我是私有方法")print(dog.__gender) #子類訪問(wèn)父類的私有屬性,會(huì)報(bào)錯(cuò)dog.__test() #子類調(diào)用父類的私有方法,會(huì)報(bào)錯(cuò)知識(shí)儲(chǔ)備—繼承2.多繼承多繼承是指一個(gè)子類可以同時(shí)繼承多個(gè)父類的屬性和方法。這使得子類可以具有多個(gè)父類的特性。Python中多繼承的語(yǔ)法格式如下:知識(shí)儲(chǔ)備—繼承class子類名(父類名1,父類名2,...):……語(yǔ)法格式2.多繼承比如房車是房屋和汽車的組合,既具有房屋的居住功能,也具有汽車的行駛功能,它們的繼承關(guān)系如下圖所示:知識(shí)儲(chǔ)備—繼承2.多繼承【示例9】定義一個(gè)房屋類(House)、一個(gè)汽車類(Car)和一個(gè)繼承House和Car的房車子類(RecreationalVehicle),示例代碼如下:classHouse(object):deflive(self):print("居住")classCar(object):defdrive(self):print("行駛")classRecreationalVehicle(House,Car):passtour_car=RecreationalVehicle()tour_car.live()tour_car.drive()知識(shí)儲(chǔ)備—繼承知識(shí)儲(chǔ)備—方法重寫方法重寫(Overwriting),又稱為方法覆蓋,在面向?qū)ο缶幊讨兄傅氖亲宇愔匦聦?shí)現(xiàn)父類中已有的方法,覆蓋父類方法的實(shí)現(xiàn)。方法重寫發(fā)生在繼承關(guān)系中。Python中的方法重寫不要求參數(shù)列表完全一致,也不強(qiáng)制要求重寫后的返回類型與父類的方法一致?!臼纠?0】定義一個(gè)動(dòng)物類(Animal)和一個(gè)繼承Animal類的狗類(Dog)和貓類(Cat),在Dog類和Cat類中重寫Animal類的方法,示例代碼如下:#定義動(dòng)物類classAnimal:defeat(self):print("吃")#定義狗類并繼承動(dòng)物類classDog(Animal):defeat(self): #重寫的方法

print("吃骨頭")#定義貓類并繼承動(dòng)物類classCat(Animal):defeat(self): #重寫的方法

print("吃魚")dog=Dog()dog.eat() #調(diào)用重寫的方法cat=Cat()cat.eat() #調(diào)用重寫的方法知識(shí)儲(chǔ)備—方法重寫子類重寫了父類的方法后,無(wú)法直接調(diào)用父類同名的方法,但可以在子類中通過(guò)super()函數(shù)調(diào)用父類的方法。在上面示例的Dog類和Cat類的eat()方法中調(diào)用父類的eat()方法,修改后的代碼如下:classDog(Animal):defeat(self):super().eat() #調(diào)用父類的方法

print("吃骨頭")classCat(Animal):defeat(self):super().eat() #調(diào)用父類的方法

print("吃魚")知識(shí)儲(chǔ)備—方法重寫案例實(shí)現(xiàn)創(chuàng)建名稱為“幾何圖形計(jì)算器”的項(xiàng)目,在項(xiàng)目下創(chuàng)建名稱為geometry的Python文件。準(zhǔn)備工作案例實(shí)現(xiàn)STEP01定義基類(Shape)創(chuàng)建一個(gè)基類,作為所有幾何圖形類的父類,定義通用的屬性和方法,其中部分方法需要子類進(jìn)行重寫。classShape:def__init__(self,name):self.__name=name #私有屬性

defget_name(self):"""獲取圖形名稱(公有方法)"""returnself.__namedefset_name(self,name):"""設(shè)置圖形名稱(公有方法)"""self.__name=namedefarea(self):"""計(jì)算面積(虛方法)"""…defperimeter(self):"""計(jì)算周長(zhǎng)(虛方法)"""…defdescription(self):"""圖形描述"""…案例實(shí)現(xiàn)STEP02定義矩形類(Rectanglek)創(chuàng)建一個(gè)矩形類,繼承自Shape類,實(shí)現(xiàn)矩形的面積和周長(zhǎng)計(jì)算方法。classRectangle(Shape):def__init__(self,length,width):super().__init__("矩形")self.__length=lengthself.__width=widthdefget_length(self):"""獲取長(zhǎng)度(公有方法)"""returnself.__lengthdefget_width(self):"""獲取寬度(公有方法)"""returnself.__widthdefarea(self):"""重寫:計(jì)算矩形面積"""returnself.__length*self.__widthdefperimeter(self):"""重寫:計(jì)算矩形周長(zhǎng)"""return2*(self.__length+self.__width)案例實(shí)現(xiàn)STEP03定義圓形類(Circle)創(chuàng)建一個(gè)圓形類,繼承自Shape類,實(shí)現(xiàn)圓形的面積和周長(zhǎng)計(jì)算方法。classCircle(Shape):def__init__(self,radius):super().__init__("圓形")self.__radius=radius #私有屬性

defget_radius(self):"""獲取半徑(公有方法)"""returnself.__radiusdefarea(self):"""重寫:計(jì)算圓形面積"""returnmath.pi*self.__radius**2defperimeter(self):"""重寫:計(jì)算圓形周長(zhǎng)(圓周長(zhǎng))"""return2*math.pi*self.__radius案例實(shí)現(xiàn)STEP045.定義正方形類(Square)創(chuàng)建一個(gè)正方形類,繼承自Rectangle類,因?yàn)檎叫问翘厥獾木匦?。classSquare(Rectangle):def__init__(self,side):super().__init__(side,side)super().set_name("正方形")案例實(shí)現(xiàn)STEP05定義獲取正數(shù)的函數(shù)創(chuàng)建get_positive_number()函數(shù)確保用戶輸入正數(shù),如果用戶輸入無(wú)效或非正數(shù),提示用戶重新輸入。defget_positive_number(prompt):whileTrue:try:value=float(input(prompt))ifvalue<=0:print("請(qǐng)輸入一個(gè)正數(shù)!")continuereturnvalueexceptValueError:print("輸入無(wú)效,請(qǐng)輸入一個(gè)數(shù)字!")案例實(shí)現(xiàn)STEP06定義主程序函數(shù)main處理用戶輸入,根據(jù)用戶選擇的圖形類型,獲取相應(yīng)的參數(shù),創(chuàng)建圖形對(duì)象,并顯示圖形的信息。defmain():print("===幾何圖形計(jì)算器===")whileTrue:print("\n請(qǐng)選擇圖形類型:")print("1.矩形")print("2.正方形")print("3.圓形")print("4.退出")choice=input("請(qǐng)輸入選項(xiàng)(1-4):")ifchoice=='1':length=get_positive_number("請(qǐng)輸入矩形的長(zhǎng)度:")width=get_positive_number("請(qǐng)輸入矩形的寬度:")shape=Rectangle(length,width)…else:print("無(wú)效的選擇,請(qǐng)重新輸入!")continue#顯示圖形信息

print("\n"+"="*30)print(shape.description())print("="*30)案例實(shí)現(xiàn)STEP07程序執(zhí)行入口確保程序作為腳本運(yùn)行時(shí),調(diào)用main函數(shù)啟動(dòng)程序。if__name__=="__main__":main()【案例7-3】垃圾分類處理查詢系統(tǒng)03案例分析在“綠水青山就是金山銀山”理念深入人心的今天,垃圾分類作為生態(tài)文明建設(shè)的重要一環(huán),已成為社會(huì)各界關(guān)注的焦點(diǎn)。垃圾分類處理查詢系統(tǒng)以《生活垃圾分類制度實(shí)施方案》為依據(jù),通過(guò)模擬真實(shí)垃圾分類場(chǎng)景,實(shí)現(xiàn)了以下核心功能:智能垃圾分類識(shí)別、處理流程可視化、環(huán)保知識(shí)科普教育及政策宣傳解讀。用戶通過(guò)該系統(tǒng)可直觀理解垃圾分類的完整流程——從社區(qū)分類站到城市處理中心的全鏈條運(yùn)作,深入掌握不同垃圾類型的處理方式與資源循環(huán)利用途徑。系統(tǒng)內(nèi)置的環(huán)保知識(shí)庫(kù)結(jié)合每類垃圾處理過(guò)程,實(shí)時(shí)輸出《方案》政策解讀、資源回收經(jīng)濟(jì)效益分析、環(huán)境影響評(píng)估等內(nèi)容,引導(dǎo)用戶深刻體會(huì)綠色發(fā)展理念在實(shí)際生活中的具體應(yīng)用,增強(qiáng)個(gè)人環(huán)保意識(shí)與社會(huì)責(zé)任感。知識(shí)儲(chǔ)備抽象類多態(tài)知識(shí)儲(chǔ)備知識(shí)儲(chǔ)備—抽象類抽象類是一種特殊的類,它不能被實(shí)例化,主要用于定義一組必須由子類實(shí)現(xiàn)的方法。抽象類為子類提供了一個(gè)統(tǒng)一的接口規(guī)范,確保子類實(shí)現(xiàn)特定的方法,從而實(shí)現(xiàn)多態(tài)性。1.抽象類的基本概念抽象類:包含抽象方法的類,無(wú)法直接實(shí)例化。抽象方法:只定義方法簽名,但沒(méi)有具體實(shí)現(xiàn)的方法,必須由子類實(shí)現(xiàn)。具體類:繼承自抽象類,并實(shí)現(xiàn)了所有抽象方法的類,可以被實(shí)例化。知識(shí)儲(chǔ)備—抽象類2.創(chuàng)建抽象類Python通過(guò)abc模塊提供了抽象基類(AbstractBaseClasses,ABCs)的功能。要定義一個(gè)抽象類,你需要:①導(dǎo)入abc模塊。②使用abc.ABC作為元類或abc.abstractmethod裝飾器來(lái)標(biāo)記抽象方法。2.創(chuàng)建抽象類【示例11】定義一個(gè)幾何圖形抽象類,該抽象類中具有兩個(gè)抽象方法aera()和perimeter(),示例代碼如下:fromabcimportABC,abstractmethodclassShape(ABC): #繼承自ABC(抽象基類)

@abstractmethod #聲明抽象方法

defarea(self):pass@abstractmethoddefperimeter(self):pass知識(shí)儲(chǔ)備—抽象類2.創(chuàng)建抽象類抽象類無(wú)法實(shí)例化。嘗試直接實(shí)例化抽象類會(huì)引發(fā)TypeError。在以上示例的末尾添加如下代碼:shape=Shape() #會(huì)報(bào)錯(cuò)知識(shí)儲(chǔ)備—抽象類3.實(shí)現(xiàn)抽象類抽象類是一種不能直接實(shí)例化的類,必須由子類來(lái)實(shí)現(xiàn)其定義的抽象方法。如果子類沒(méi)有實(shí)現(xiàn)所有抽象方法,它也會(huì)被視為抽象類,無(wú)法實(shí)例化。例如,在上面示例的基礎(chǔ)上,添加實(shí)現(xiàn)抽象類Shape的子類Rectangle,代碼如下:classRectangle(Shape):def__init__(self,width,height):self.width=widthself.height=heightdefarea(self): #實(shí)現(xiàn)抽象方法

returnself.width*self.heightdefperimeter(self): #實(shí)現(xiàn)抽象方法

return2*(self.width+self.height)#創(chuàng)建子類對(duì)象rect=Rectangle(3,4)print(rect.area()) #輸出:12print(rect.perimeter()) #輸出:14知識(shí)儲(chǔ)備—抽象類3.實(shí)現(xiàn)抽象類子類必須實(shí)現(xiàn)所有在抽象基類中定義的抽象方法,否則也將無(wú)法實(shí)例化。正確的子類實(shí)現(xiàn)如下:classSquare(Shape):def__init__(self,side):self.side=sidedefarea(self):returnself.side**2defperimeter(self):return4*self.side知識(shí)儲(chǔ)備—抽象類3.實(shí)現(xiàn)抽象類抽象類中可以有非抽象方法,這些方法可以被子類直接繼承或重寫。例如,在上面示例的抽象類Shape中添加一個(gè)非抽象方法,修改后的代碼如下:classShape(ABC): #繼承自ABC(抽象基類)

@abstractmethod #聲明抽象方法

defarea(self):pass@abstractmethoddefperimeter(self):passdefdescription(self): #定義非抽象方法

return"這是一個(gè)圖形類"知識(shí)儲(chǔ)備—抽象類知識(shí)儲(chǔ)備—多態(tài)多態(tài)(Polymorphism)是面向?qū)ο缶幊痰暮诵奶匦灾?,它允許不同類的對(duì)象通過(guò)相同的接口進(jìn)行調(diào)用,從而實(shí)現(xiàn)“同一接口,多種實(shí)現(xiàn)”的效果。Python的多態(tài)具有高度靈活性,主要通過(guò)繼承、鴨子類型(DuckTyping)和抽象基類(AbstractBaseClasses)三種方式實(shí)現(xiàn)。1.繼承與方法重寫繼承與方法重寫實(shí)現(xiàn)多態(tài)的核心思想是子類重寫父類的方法,通過(guò)父類引用調(diào)用子類實(shí)現(xiàn)?!臼纠?2】定義一個(gè)動(dòng)物類(Animal)和一個(gè)繼承Animal類的狗類(Dog)和貓類(Cat),在Dog類和Cat類中重寫Animal類的方法,示例代碼如下:classAnimal:defshout(self):passclassDog(Animal):defshout(self):print("汪汪汪!")classCat(Animal):defshout(self):print("喵喵喵~")知識(shí)儲(chǔ)備—多態(tài)2.鴨子類型Python是一種動(dòng)態(tài)類型語(yǔ)言,它支持鴨子類型(DuckTyping),這意味著如果一個(gè)對(duì)象看起來(lái)像鴨子、走起路來(lái)像鴨子、叫起來(lái)也像鴨子,那么它就可以被當(dāng)作鴨子。這種方式不需要顯式地聲明接口或類型,只要對(duì)象具有所需的方法即可。知識(shí)儲(chǔ)備—多態(tài)2.鴨子類型【示例13】定義一個(gè)鳥類(Bird)、一個(gè)飛機(jī)類(Plane)和一個(gè)魚類(Fish),示例代碼如下:classBird:deffly(self):print("鳥類飛行")classPlane:deffly(self):print("飛機(jī)飛行")classFish:defswim(self):print("魚類游泳")#多態(tài)函數(shù):接受任何有fly方法的對(duì)象deflet_it_fly(obj):obj.fly()知識(shí)儲(chǔ)備—多態(tài)2.鴨子類型【示例13】(續(xù))bird=Bird()plane=Plane()fish=Fish()let_it_fly(bird)let_it_fly(plane)#let_it_fly(fish)#報(bào)錯(cuò):AttributeError,因?yàn)镕ish沒(méi)有fly方法知識(shí)儲(chǔ)備—多態(tài)鴨子類型提供了一種靈活性和動(dòng)態(tài)性的編程方式,它適用于許多情況,特別是在需要多態(tài)性但又不想涉及復(fù)雜繼承結(jié)構(gòu)的場(chǎng)合。然而,使用鴨子類型也需要考慮到其可能帶來(lái)的可讀性降低和維護(hù)難度增加的問(wèn)題。正確的做法是根據(jù)具體的項(xiàng)目和團(tuán)隊(duì)的需要,在靈活性和嚴(yán)格類型檢查之間找到平衡點(diǎn)。3.使用抽象基類(AbstractBaseClasses)Python的abc模塊提供了抽象基類的支持,這可以用來(lái)定義一個(gè)接口或一個(gè)共同的規(guī)范,然后通過(guò)繼承這些抽象基類來(lái)強(qiáng)制實(shí)現(xiàn)某些方法。知識(shí)儲(chǔ)備—多態(tài)3.使用抽象基類(AbstractBaseClasses)【示例14】定義一個(gè)動(dòng)物類(Animal),在Animal類中定于一個(gè)抽象方法,定義繼承Animal類的狗類(Dog)和貓類(Cat),在Dog類和Cat類中重寫Animal類的抽象方法,示例代碼如下:fromabcimportABC,abstractmethodclassAnimal(ABC):@abstractmethoddefshout(self):pass#抽象方法必須有實(shí)現(xiàn),除非它

溫馨提示

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