Python程序設(shè)計(jì)教程-第9章-面向?qū)ο缶幊陶n件_第1頁(yè)
Python程序設(shè)計(jì)教程-第9章-面向?qū)ο缶幊陶n件_第2頁(yè)
Python程序設(shè)計(jì)教程-第9章-面向?qū)ο缶幊陶n件_第3頁(yè)
Python程序設(shè)計(jì)教程-第9章-面向?qū)ο缶幊陶n件_第4頁(yè)
Python程序設(shè)計(jì)教程-第9章-面向?qū)ο缶幊陶n件_第5頁(yè)
已閱讀5頁(yè),還剩41頁(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ū)ο缶幊痰?章面向?qū)ο缶幊?.1.1Python的類Python類具有下列主要特點(diǎn):類定義了新的命名空間,類中的變量和函數(shù)的作用域就是類的命名空間。類是對(duì)象的模板,對(duì)象是類的實(shí)例。一個(gè)類可以有多個(gè)實(shí)例對(duì)象,每個(gè)實(shí)例對(duì)象擁有自己的命名空間。類支持繼承,通過(guò)繼承對(duì)類進(jìn)行擴(kuò)展。支持運(yùn)算符重載。通過(guò)內(nèi)置的特定方法,可以使類的對(duì)象支持內(nèi)置類型的各種運(yùn)算。在Python3.x中,類是一種數(shù)據(jù)類型,是內(nèi)置的type類的實(shí)例對(duì)象。9.1.1Python的類Python類具有下列主要特點(diǎn)9.1.2Python中的對(duì)象在Python中一切都是對(duì)象,包括前面講過(guò)的整數(shù)對(duì)象、小數(shù)對(duì)象、字符串對(duì)象、函數(shù)對(duì)象、模塊對(duì)象等。在Python的對(duì)象模型中,有兩種對(duì)象:類對(duì)象和實(shí)例對(duì)象。類對(duì)象是在執(zhí)行class語(yǔ)句時(shí)創(chuàng)建的,而實(shí)例對(duì)象是在調(diào)用類的時(shí)候創(chuàng)建的。每調(diào)用一次類,便創(chuàng)建一個(gè)實(shí)例對(duì)象。類對(duì)象只有一個(gè),而實(shí)例對(duì)象可以有多個(gè)。類對(duì)象和每個(gè)實(shí)例對(duì)象都分別擁有自己的命名空間,在各自的命名空間內(nèi)存儲(chǔ)屬于自己的數(shù)據(jù)。9.1.2Python中的對(duì)象在Python中一切都是對(duì)類對(duì)象類對(duì)象具有以下主要特點(diǎn):Python執(zhí)行class語(yǔ)句時(shí)創(chuàng)建一個(gè)類對(duì)象和一個(gè)變量即類名稱,變量引用類對(duì)象。與def類似,class也是可執(zhí)行語(yǔ)句。導(dǎo)入類模塊時(shí),class語(yǔ)句被執(zhí)行,創(chuàng)建類對(duì)象。類中的賦值語(yǔ)句創(chuàng)建的變量是類的數(shù)據(jù)屬性。與模塊類似,類中的頂層賦值語(yǔ)句創(chuàng)建的變量才屬于類對(duì)象。類的數(shù)據(jù)用“對(duì)象名.屬性名“格式來(lái)訪問(wèn)。類中的def語(yǔ)句定義的函數(shù)是類的方法,用“對(duì)象名.方法名()“格式類訪問(wèn)。類的數(shù)據(jù)和方法由所有的實(shí)例對(duì)象共享。類對(duì)象類對(duì)象具有以下主要特點(diǎn):實(shí)例對(duì)象實(shí)例對(duì)象的特點(diǎn)如下:實(shí)例對(duì)象通過(guò)調(diào)用類對(duì)象來(lái)創(chuàng)建,就像調(diào)用函數(shù)一樣來(lái)調(diào)用類對(duì)象。每個(gè)實(shí)例對(duì)象繼承類對(duì)象的屬性,獲得自己的命名空間。實(shí)例對(duì)象擁有“私有“屬性。類的方法函數(shù)的第一個(gè)參數(shù)默認(rèn)為self,表示引用方法的對(duì)象實(shí)例。在方法中對(duì)self的屬性賦值才會(huì)創(chuàng)建屬于實(shí)例對(duì)象的屬性。實(shí)例對(duì)象實(shí)例對(duì)象的特點(diǎn)如下:9.2定義和使用類9.2.1定義類類定義的基本格式如下:class類名:

賦值語(yǔ)句

賦值語(yǔ)句……def語(yǔ)句定義函數(shù)def語(yǔ)句定義函數(shù)……9.2定義和使用類9.2.1定義類9.2.2使用類class語(yǔ)句執(zhí)行后,類對(duì)象即被創(chuàng)建,進(jìn)一步可以使用類對(duì)象來(lái)訪問(wèn)類的屬性、創(chuàng)建實(shí)例對(duì)象。9.2.2使用類9.3類、對(duì)象的屬性和方法在C++和Java語(yǔ)言中,對(duì)屬性和方法的公有和私有都是通過(guò)訪問(wèn)修飾符來(lái)區(qū)分的,例如公有屬性和私有屬性分別使用訪問(wèn)修飾符public和private。但在Python中,由于沒(méi)有這些訪問(wèn)修飾符,所以Python中屬性和方法的公有和私有是通過(guò)標(biāo)識(shí)符的約定來(lái)區(qū)分的。9.3類、對(duì)象的屬性和方法在C++和Java語(yǔ)言中,對(duì)屬9.3.1屬性1.根據(jù)所屬的對(duì)象分為類屬性和對(duì)象屬性

在類內(nèi),且在方法外定義的,無(wú)特別聲明的變量稱為類屬性,或者稱為靜態(tài)屬性,相當(dāng)于Java語(yǔ)言中用static關(guān)鍵字聲明的變量。類屬性既可以通過(guò)類名來(lái)訪問(wèn),又可以通過(guò)對(duì)象名來(lái)訪問(wèn)。對(duì)象屬性要放在方法中聲明,且有對(duì)象名(通常為self).前綴時(shí),只能通過(guò)對(duì)象名訪問(wèn)。2.根據(jù)訪問(wèn)的權(quán)限分為公有屬性和私有屬性

在C++和Java語(yǔ)言中,公有屬性和私有屬性分別使用訪問(wèn)修飾符public和private聲明,而在Python中是通過(guò)標(biāo)識(shí)符的約定來(lái)區(qū)分的。如果屬性的標(biāo)識(shí)符名稱以兩個(gè)下劃線開頭,則說(shuō)明是私有屬性,否則是公有屬性。公有屬性和前面例子中的訪問(wèn)一樣,而私有屬性則通過(guò)如下語(yǔ)法才能夠訪問(wèn):

類(對(duì)象)名._類名__私有屬性名

其中,類名前是一個(gè)下劃線,類名后是兩個(gè)下劃線。下面通過(guò)一個(gè)例子來(lái)理解私有屬性和公有屬性。9.3.1屬性1.根據(jù)所屬的對(duì)象分為類屬性和對(duì)象屬性9.3.2方法方法也可以分為公有方法和私有方法、類方法和對(duì)象方法。此外,還有靜態(tài)方法。對(duì)象的方法:公有方法和私有方法

定義公有方法無(wú)需特別聲明,而定義私有方法時(shí),方法名要以兩個(gè)下劃線開頭。調(diào)用時(shí),無(wú)論是公有方法還是私有方法,都可以通過(guò)類或者對(duì)象的方式調(diào)用。但是如果通過(guò)類的方式調(diào)用,則必須要傳入一個(gè)對(duì)象;而調(diào)用私有方法必須通過(guò)以下方法調(diào)用:

類(對(duì)象)名._類名__私有方法名()

可以看到,這和訪問(wèn)私有屬性非常相似,只是把私有屬性名改成私有方法名。下面通過(guò)一個(gè)例子來(lái)理解公有方法和私有方法。9.3.2方法方法也可以分為公有方法和私有方法、類方法和類方法和靜態(tài)方法

定義類方法時(shí)可以通過(guò)@classmethod指令的方式定義或者通過(guò)使用內(nèi)建函數(shù)classmethod的方式將一個(gè)普通的方法轉(zhuǎn)為類方法。類似的,定義靜態(tài)方法時(shí)可以通過(guò)@staticmethod指令的方式定義或者通過(guò)內(nèi)建函數(shù)staticmethod的方式將一個(gè)普通的方法轉(zhuǎn)為靜態(tài)方法。調(diào)用時(shí),無(wú)論是類方法還是靜態(tài)方法,都可以通過(guò)類或者對(duì)象的方式調(diào)用。類方法和靜態(tài)方法9.4類的組合一個(gè)類被定義后,目的就是要把它當(dāng)成一個(gè)模塊來(lái)使用,并把它嵌入到我們的代碼中。有兩種方式可以利用這些已定義好的類,其中一種就是這里介紹的組合,這種方式就是讓不同的類混合并入其它的類,形成更加復(fù)雜、更符合需求的類,從而增加功能和提高代碼重用性。9.4類的組合一個(gè)類被定義后,目的就是要把它當(dāng)成一個(gè)模塊9.5繼承與派生9.5.1派生類的定義

定義派生類的一般形式:

class派生類類名(基類類名):def__init__(self[,args]):#構(gòu)造方法基類類名.__init__(self[,args])#調(diào)用基類的構(gòu)造方法[新增屬性的賦值]

在派生類類名后的括號(hào)內(nèi)指定所要繼承的基類類名,由于定義一個(gè)類通常都會(huì)包含__init__構(gòu)造方法,所以在派生類中首先也會(huì)定義該方法,在該方法中先調(diào)用基類的構(gòu)造方法,并傳以必要的參數(shù),用于初始化基類的屬性。然后會(huì)通過(guò)賦值語(yǔ)句初始化派生類中新增加的屬性。9.5繼承與派生9.5.1派生類的定義9.5.2super和方法重載使用super內(nèi)建函數(shù)來(lái)調(diào)用基類中的方法,如果基類的名稱改變或者派生類改為繼承其它的類時(shí),只需要修改派生類繼承基類的名稱即可。這樣既可以將代碼的維護(hù)量降到最低,又可以提高程序開發(fā)的周期。因此,定義派生類更一般的形式為:

class派生類類名(基類類名):def__init__(self[,args]):#構(gòu)造方法

super(派生類類名,self).__init__([args])#調(diào)用基類的構(gòu)造方法[新增屬性的賦值]9.5.2super和方法重載9.5.3多重繼承多重繼承指子類可以同時(shí)繼承多個(gè)超類。如果超類中存在同名的屬性或方法,Python按照一定的方法解析順序MRO(MethodResolutionOrder)在超類中搜索方法。此時(shí)的方法解析順序采用廣度優(yōu)先搜索算法,從左到右進(jìn)行搜索。9.5.3多重繼承9.6運(yùn)算符重載和模塊中的類9.6.1運(yùn)算符重載運(yùn)算符重載是通過(guò)實(shí)現(xiàn)特定的方法使類的實(shí)例對(duì)象支持Python的各種內(nèi)置操作。重載運(yùn)算符就是在類中定義相應(yīng)的方法,當(dāng)使用實(shí)例對(duì)象執(zhí)行相關(guān)運(yùn)算時(shí),則調(diào)用對(duì)應(yīng)方法。9.6.2模塊中的類Python可以將模塊中的類導(dǎo)入到當(dāng)前模塊使用。導(dǎo)入的類是模塊對(duì)象的一個(gè)屬性,就像模塊中的函數(shù)一樣,可以像調(diào)用模塊函數(shù)一樣來(lái)調(diào)用類對(duì)象。9.6運(yùn)算符重載和模塊中的類9.6.1運(yùn)算符重載9.7異常處理異常是程序在運(yùn)行過(guò)程中,在特定條件下引發(fā)的錯(cuò)誤。例如:打開不存在的文件、序列索引越界、不兼容類型之間執(zhí)行運(yùn)算等,都會(huì)產(chǎn)生異常。異常并非語(yǔ)法錯(cuò)誤或程序邏輯錯(cuò)誤。Python在運(yùn)行程序時(shí),首先會(huì)掃描程序檢查語(yǔ)法錯(cuò)誤。程序邏輯錯(cuò)誤屬于設(shè)計(jì)問(wèn)題,非程序本身問(wèn)題。異常可以在程序運(yùn)行過(guò)程中進(jìn)行捕捉、處理,從而避免程序意外崩潰。對(duì)程序執(zhí)行異常處理,是一種良好的編程習(xí)慣。9.7異常處理異常是程序在運(yùn)行過(guò)程中,在特定條件下引發(fā)的9.7.1Python異常處理機(jī)制在Python中,異常處理常用于處理下列情況:錯(cuò)誤處理:這是異常處理的典型應(yīng)用,在程序中捕捉可能發(fā)生的錯(cuò)誤,提供處理措施,例如直接忽略、打印錯(cuò)誤、寫異常日志等。Python使用try語(yǔ)句捕捉和處理異常,發(fā)生錯(cuò)誤時(shí),執(zhí)行try語(yǔ)句中的異常處理代碼,然后正常執(zhí)行try語(yǔ)句后面的代碼。終極行為:在try語(yǔ)句中使用finally定義終極行為,不管程序中是否發(fā)生異常,finally部分的代碼都會(huì)執(zhí)行。例如,在讀寫文件時(shí),用finally定義文件關(guān)閉操作。利用異常處理實(shí)現(xiàn)非常規(guī)的流程控制。在代碼中根據(jù)需要使用raise語(yǔ)句,主動(dòng)拋出內(nèi)置異?;蛘呤亲远x的異常,實(shí)現(xiàn)程序的流程跳轉(zhuǎn)。9.7.1Python異常處理機(jī)制在Python中,異常Python內(nèi)置的常見異常類型如下:AttributeError:訪問(wèn)對(duì)象屬性時(shí)引發(fā)的異常,如屬性不存在或不支持賦值等。EOFError:使用input()函數(shù)讀文件時(shí),遇到文件結(jié)束標(biāo)志EOF時(shí)發(fā)生的異常。文件對(duì)象的read()和readline()方法遇到EOF時(shí)返回空字符串,不會(huì)引發(fā)異常。ImportError:導(dǎo)入模塊出錯(cuò)引發(fā)的異常。IndexError:使用序列對(duì)象的下標(biāo)超出范圍時(shí)引發(fā)的異常。StopIteration:迭代器沒(méi)有進(jìn)一步可迭代元素時(shí)引發(fā)的異常。IndentationError:使用了不正確的縮進(jìn)時(shí)引發(fā)的異常。TabError:使用[Tab]鍵和空格縮進(jìn)時(shí)不一致引發(fā)的異常。TypeError:在運(yùn)算或函數(shù)調(diào)用中,使用了不兼容的類型時(shí)引發(fā)的異常。ZeroDivisionError:除數(shù)為0時(shí)引發(fā)的異常。Python內(nèi)置的常見異常類型如下:9.7.2主動(dòng)引發(fā)異常并非只有在程序運(yùn)行出錯(cuò)時(shí)才會(huì)引發(fā)異常,Python允許在代碼中使用raise語(yǔ)句主動(dòng)引發(fā)異常。raise語(yǔ)句基本格式如下:raise異常類名#創(chuàng)建異常類的實(shí)例對(duì)象,并引發(fā)異常raise異常類實(shí)例對(duì)象#引發(fā)異常類實(shí)例對(duì)象對(duì)應(yīng)的異常raise#重新引發(fā)剛剛發(fā)生的異常Python執(zhí)行raise語(yǔ)句時(shí),會(huì)引發(fā)異常并傳遞異常類的實(shí)例對(duì)象。9.7.2主動(dòng)引發(fā)異常并非只有在程序運(yùn)行出錯(cuò)時(shí)才會(huì)引發(fā)異9.7.3自定義異常類當(dāng)Python的內(nèi)建異常類型不能滿足我們的需要時(shí),我們可以自定義異常的類型。自定義異常是一個(gè)類,它必須繼承Exception或者BaseException類,按照命名規(guī)范,自定義異常通常以Error結(jié)尾,以顯式地告訴程序員出現(xiàn)異常的類型,自定義異常只能通過(guò)raise語(yǔ)句手動(dòng)拋出。9.7.3自定義異常類當(dāng)Python的內(nèi)建異常類型不能滿9.8實(shí)例:用戶注冊(cè)信息本節(jié)綜合應(yīng)用本章所學(xué)內(nèi)容,創(chuàng)建一個(gè)用戶注冊(cè)信息管理系統(tǒng)。系統(tǒng)使用磁盤文件保存注冊(cè)用戶數(shù)據(jù),可以讀出文件中的數(shù)據(jù)進(jìn)行查看、修改、刪除和添加用戶信息。同時(shí),添加異常處理。在遇到異常時(shí),打印提示信息,并將異常信息寫入日志文件。9.8.1功能預(yù)覽用戶注冊(cè)信息管理系統(tǒng)包括主界面菜單、顯示全部已注冊(cè)用戶、查看/修改/刪除用戶信息、添加新用戶、保存用戶數(shù)據(jù)、退出系統(tǒng)等主要功能。9.8實(shí)例:用戶注冊(cè)信息本節(jié)綜合應(yīng)用本章所學(xué)內(nèi)容,創(chuàng)建一9.8實(shí)例:用戶注冊(cè)信息9.8.2功能實(shí)現(xiàn)系統(tǒng)功能實(shí)現(xiàn)的基本思路如下:系統(tǒng)運(yùn)行時(shí),使用一個(gè)列表對(duì)象來(lái)保存注冊(cè)用戶數(shù)據(jù)。用戶查找、修改、刪除和添加等操作都針對(duì)該列表進(jìn)行。列表中每個(gè)元素為類的實(shí)例對(duì)象,對(duì)象的屬性存儲(chǔ)注冊(cè)用戶的用戶名和登錄密碼,對(duì)象的方法提供修改屬性值功能。注冊(cè)用戶數(shù)據(jù)存放在文件中,系統(tǒng)啟動(dòng)時(shí)將文件中保存的用戶數(shù)據(jù)列表對(duì)象載入到程序中。通過(guò)系統(tǒng)菜單選擇是否將當(dāng)前用戶數(shù)據(jù)寫入文件保存。系統(tǒng)主界面循環(huán)顯示,每執(zhí)行完一個(gè)菜單操作后,都重新顯示主界面,直到選擇退出系統(tǒng)。設(shè)計(jì)時(shí),各個(gè)菜單操作分別定義為一個(gè)函數(shù)。這樣,主界面實(shí)現(xiàn)代碼的結(jié)構(gòu)非常清晰。系統(tǒng)發(fā)生異常時(shí),除了將異常信息顯示給用戶外,還將異常信息寫入文件chapter9_do_log.txt。9.8實(shí)例:用戶注冊(cè)信息9.8.2功能實(shí)現(xiàn)第9章

面向?qū)ο缶幊痰?章面向?qū)ο缶幊?.1.1Python的類Python類具有下列主要特點(diǎn):類定義了新的命名空間,類中的變量和函數(shù)的作用域就是類的命名空間。類是對(duì)象的模板,對(duì)象是類的實(shí)例。一個(gè)類可以有多個(gè)實(shí)例對(duì)象,每個(gè)實(shí)例對(duì)象擁有自己的命名空間。類支持繼承,通過(guò)繼承對(duì)類進(jìn)行擴(kuò)展。支持運(yùn)算符重載。通過(guò)內(nèi)置的特定方法,可以使類的對(duì)象支持內(nèi)置類型的各種運(yùn)算。在Python3.x中,類是一種數(shù)據(jù)類型,是內(nèi)置的type類的實(shí)例對(duì)象。9.1.1Python的類Python類具有下列主要特點(diǎn)9.1.2Python中的對(duì)象在Python中一切都是對(duì)象,包括前面講過(guò)的整數(shù)對(duì)象、小數(shù)對(duì)象、字符串對(duì)象、函數(shù)對(duì)象、模塊對(duì)象等。在Python的對(duì)象模型中,有兩種對(duì)象:類對(duì)象和實(shí)例對(duì)象。類對(duì)象是在執(zhí)行class語(yǔ)句時(shí)創(chuàng)建的,而實(shí)例對(duì)象是在調(diào)用類的時(shí)候創(chuàng)建的。每調(diào)用一次類,便創(chuàng)建一個(gè)實(shí)例對(duì)象。類對(duì)象只有一個(gè),而實(shí)例對(duì)象可以有多個(gè)。類對(duì)象和每個(gè)實(shí)例對(duì)象都分別擁有自己的命名空間,在各自的命名空間內(nèi)存儲(chǔ)屬于自己的數(shù)據(jù)。9.1.2Python中的對(duì)象在Python中一切都是對(duì)類對(duì)象類對(duì)象具有以下主要特點(diǎn):Python執(zhí)行class語(yǔ)句時(shí)創(chuàng)建一個(gè)類對(duì)象和一個(gè)變量即類名稱,變量引用類對(duì)象。與def類似,class也是可執(zhí)行語(yǔ)句。導(dǎo)入類模塊時(shí),class語(yǔ)句被執(zhí)行,創(chuàng)建類對(duì)象。類中的賦值語(yǔ)句創(chuàng)建的變量是類的數(shù)據(jù)屬性。與模塊類似,類中的頂層賦值語(yǔ)句創(chuàng)建的變量才屬于類對(duì)象。類的數(shù)據(jù)用“對(duì)象名.屬性名“格式來(lái)訪問(wèn)。類中的def語(yǔ)句定義的函數(shù)是類的方法,用“對(duì)象名.方法名()“格式類訪問(wèn)。類的數(shù)據(jù)和方法由所有的實(shí)例對(duì)象共享。類對(duì)象類對(duì)象具有以下主要特點(diǎn):實(shí)例對(duì)象實(shí)例對(duì)象的特點(diǎn)如下:實(shí)例對(duì)象通過(guò)調(diào)用類對(duì)象來(lái)創(chuàng)建,就像調(diào)用函數(shù)一樣來(lái)調(diào)用類對(duì)象。每個(gè)實(shí)例對(duì)象繼承類對(duì)象的屬性,獲得自己的命名空間。實(shí)例對(duì)象擁有“私有“屬性。類的方法函數(shù)的第一個(gè)參數(shù)默認(rèn)為self,表示引用方法的對(duì)象實(shí)例。在方法中對(duì)self的屬性賦值才會(huì)創(chuàng)建屬于實(shí)例對(duì)象的屬性。實(shí)例對(duì)象實(shí)例對(duì)象的特點(diǎn)如下:9.2定義和使用類9.2.1定義類類定義的基本格式如下:class類名:

賦值語(yǔ)句

賦值語(yǔ)句……def語(yǔ)句定義函數(shù)def語(yǔ)句定義函數(shù)……9.2定義和使用類9.2.1定義類9.2.2使用類class語(yǔ)句執(zhí)行后,類對(duì)象即被創(chuàng)建,進(jìn)一步可以使用類對(duì)象來(lái)訪問(wèn)類的屬性、創(chuàng)建實(shí)例對(duì)象。9.2.2使用類9.3類、對(duì)象的屬性和方法在C++和Java語(yǔ)言中,對(duì)屬性和方法的公有和私有都是通過(guò)訪問(wèn)修飾符來(lái)區(qū)分的,例如公有屬性和私有屬性分別使用訪問(wèn)修飾符public和private。但在Python中,由于沒(méi)有這些訪問(wèn)修飾符,所以Python中屬性和方法的公有和私有是通過(guò)標(biāo)識(shí)符的約定來(lái)區(qū)分的。9.3類、對(duì)象的屬性和方法在C++和Java語(yǔ)言中,對(duì)屬9.3.1屬性1.根據(jù)所屬的對(duì)象分為類屬性和對(duì)象屬性

在類內(nèi),且在方法外定義的,無(wú)特別聲明的變量稱為類屬性,或者稱為靜態(tài)屬性,相當(dāng)于Java語(yǔ)言中用static關(guān)鍵字聲明的變量。類屬性既可以通過(guò)類名來(lái)訪問(wèn),又可以通過(guò)對(duì)象名來(lái)訪問(wèn)。對(duì)象屬性要放在方法中聲明,且有對(duì)象名(通常為self).前綴時(shí),只能通過(guò)對(duì)象名訪問(wèn)。2.根據(jù)訪問(wèn)的權(quán)限分為公有屬性和私有屬性

在C++和Java語(yǔ)言中,公有屬性和私有屬性分別使用訪問(wèn)修飾符public和private聲明,而在Python中是通過(guò)標(biāo)識(shí)符的約定來(lái)區(qū)分的。如果屬性的標(biāo)識(shí)符名稱以兩個(gè)下劃線開頭,則說(shuō)明是私有屬性,否則是公有屬性。公有屬性和前面例子中的訪問(wèn)一樣,而私有屬性則通過(guò)如下語(yǔ)法才能夠訪問(wèn):

類(對(duì)象)名._類名__私有屬性名

其中,類名前是一個(gè)下劃線,類名后是兩個(gè)下劃線。下面通過(guò)一個(gè)例子來(lái)理解私有屬性和公有屬性。9.3.1屬性1.根據(jù)所屬的對(duì)象分為類屬性和對(duì)象屬性9.3.2方法方法也可以分為公有方法和私有方法、類方法和對(duì)象方法。此外,還有靜態(tài)方法。對(duì)象的方法:公有方法和私有方法

定義公有方法無(wú)需特別聲明,而定義私有方法時(shí),方法名要以兩個(gè)下劃線開頭。調(diào)用時(shí),無(wú)論是公有方法還是私有方法,都可以通過(guò)類或者對(duì)象的方式調(diào)用。但是如果通過(guò)類的方式調(diào)用,則必須要傳入一個(gè)對(duì)象;而調(diào)用私有方法必須通過(guò)以下方法調(diào)用:

類(對(duì)象)名._類名__私有方法名()

可以看到,這和訪問(wèn)私有屬性非常相似,只是把私有屬性名改成私有方法名。下面通過(guò)一個(gè)例子來(lái)理解公有方法和私有方法。9.3.2方法方法也可以分為公有方法和私有方法、類方法和類方法和靜態(tài)方法

定義類方法時(shí)可以通過(guò)@classmethod指令的方式定義或者通過(guò)使用內(nèi)建函數(shù)classmethod的方式將一個(gè)普通的方法轉(zhuǎn)為類方法。類似的,定義靜態(tài)方法時(shí)可以通過(guò)@staticmethod指令的方式定義或者通過(guò)內(nèi)建函數(shù)staticmethod的方式將一個(gè)普通的方法轉(zhuǎn)為靜態(tài)方法。調(diào)用時(shí),無(wú)論是類方法還是靜態(tài)方法,都可以通過(guò)類或者對(duì)象的方式調(diào)用。類方法和靜態(tài)方法9.4類的組合一個(gè)類被定義后,目的就是要把它當(dāng)成一個(gè)模塊來(lái)使用,并把它嵌入到我們的代碼中。有兩種方式可以利用這些已定義好的類,其中一種就是這里介紹的組合,這種方式就是讓不同的類混合并入其它的類,形成更加復(fù)雜、更符合需求的類,從而增加功能和提高代碼重用性。9.4類的組合一個(gè)類被定義后,目的就是要把它當(dāng)成一個(gè)模塊9.5繼承與派生9.5.1派生類的定義

定義派生類的一般形式:

class派生類類名(基類類名):def__init__(self[,args]):#構(gòu)造方法基類類名.__init__(self[,args])#調(diào)用基類的構(gòu)造方法[新增屬性的賦值]

在派生類類名后的括號(hào)內(nèi)指定所要繼承的基類類名,由于定義一個(gè)類通常都會(huì)包含__init__構(gòu)造方法,所以在派生類中首先也會(huì)定義該方法,在該方法中先調(diào)用基類的構(gòu)造方法,并傳以必要的參數(shù),用于初始化基類的屬性。然后會(huì)通過(guò)賦值語(yǔ)句初始化派生類中新增加的屬性。9.5繼承與派生9.5.1派生類的定義9.5.2super和方法重載使用super內(nèi)建函數(shù)來(lái)調(diào)用基類中的方法,如果基類的名稱改變或者派生類改為繼承其它的類時(shí),只需要修改派生類繼承基類的名稱即可。這樣既可以將代碼的維護(hù)量降到最低,又可以提高程序開發(fā)的周期。因此,定義派生類更一般的形式為:

class派生類類名(基類類名):def__init__(self[,args]):#構(gòu)造方法

super(派生類類名,self).__init__([args])#調(diào)用基類的構(gòu)造方法[新增屬性的賦值]9.5.2super和方法重載9.5.3多重繼承多重繼承指子類可以同時(shí)繼承多個(gè)超類。如果超類中存在同名的屬性或方法,Python按照一定的方法解析順序MRO(MethodResolutionOrder)在超類中搜索方法。此時(shí)的方法解析順序采用廣度優(yōu)先搜索算法,從左到右進(jìn)行搜索。9.5.3多重繼承9.6運(yùn)算符重載和模塊中的類9.6.1運(yùn)算符重載運(yùn)算符重載是通過(guò)實(shí)現(xiàn)特定的方法使類的實(shí)例對(duì)象支持Python的各種內(nèi)置操作。重載運(yùn)算符就是在類中定義相應(yīng)的方法,當(dāng)使用實(shí)例對(duì)象執(zhí)行相關(guān)運(yùn)算時(shí),則調(diào)用對(duì)應(yīng)方法。9.6.2模塊中的類Python可以將模塊中的類導(dǎo)入到當(dāng)前模塊使用。導(dǎo)入的類是模塊對(duì)象的一個(gè)屬性,就像模塊中的函數(shù)一樣,可以像調(diào)用模塊函數(shù)一樣來(lái)調(diào)用類對(duì)象。9.6運(yùn)算符重載和模塊中的類9.6.1運(yùn)算符重載9.7異常處理異常是程序在運(yùn)行過(guò)程中,在特定條件下引發(fā)的錯(cuò)誤。例如:打開不存在的文件、序列索引越界、不兼容類型之間執(zhí)行運(yùn)算等,都會(huì)產(chǎn)生異常。異常并非語(yǔ)法錯(cuò)誤或程序邏輯錯(cuò)誤。Python在運(yùn)行程序時(shí),首先會(huì)掃描程序檢查語(yǔ)法錯(cuò)誤。程序邏輯錯(cuò)誤屬于設(shè)計(jì)問(wèn)題,非程序本身問(wèn)題。異??梢栽诔绦蜻\(yùn)行過(guò)程中進(jìn)行捕捉、處理,從而避免程序意外崩潰。對(duì)程序執(zhí)行異常處理,是一種良好的編程習(xí)慣。9.7異常處理異常是程序在運(yùn)行過(guò)程中,在特定條件下引發(fā)的9.7.1Python異常處理機(jī)制在Python中,異常處理常用于處理下列情況:錯(cuò)誤處理:這是異常處理的典型應(yīng)用,在程序中捕捉可能發(fā)生的錯(cuò)誤,提供處理措施,例如直接忽略、打印錯(cuò)誤、寫異常日志等。Python使用try語(yǔ)句捕捉和處理異常,發(fā)生錯(cuò)誤時(shí),執(zhí)行try語(yǔ)句中的異常處理代碼,然后正常執(zhí)行try語(yǔ)句后面的代碼。終極行為:在try語(yǔ)句中使用finally定義終極行為,不管程序中是否發(fā)生異常,finally部分的代碼都會(huì)執(zhí)行。例如,在讀寫文件時(shí),用finally定義文件關(guān)閉操作。利用異常處理實(shí)現(xiàn)非常規(guī)的流程控制。在代碼中根據(jù)需要使用raise語(yǔ)句,主動(dòng)拋出內(nèi)置異?;蛘呤亲远x的異常,實(shí)現(xiàn)程序的流程跳轉(zhuǎn)。9.7.1Python異常處理機(jī)制在Python中,異常Python內(nèi)置的常見異常類型如下:AttributeError:訪問(wèn)對(duì)象屬性時(shí)引發(fā)的異常,如屬性不存在或不支持賦值等。EOFError:使用input()函數(shù)讀文件時(shí),遇到文件結(jié)束標(biāo)志EOF時(shí)發(fā)生的異常。文件對(duì)象的read()和readline()方法遇到EOF時(shí)返回空字符串,不會(huì)引發(fā)異常。ImportError:導(dǎo)入模塊出錯(cuò)引發(fā)的異常。IndexError:使用序列對(duì)象的下標(biāo)超出范圍時(shí)引發(fā)的異常。StopIteration:迭代器沒(méi)有進(jìn)一步可迭代元素時(shí)引發(fā)的異常。IndentationError:使用了不正確的縮進(jìn)時(shí)引發(fā)的異常。TabError:使用[Tab]鍵和空格縮進(jìn)時(shí)不一致引發(fā)的異常。TypeError:在運(yùn)算或函數(shù)調(diào)用中,使用了不兼容的類型時(shí)引發(fā)的異常。ZeroDivisionError:

溫馨提示

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