![《Python編程基礎與應用》面向對象編程_第1頁](http://file4.renrendoc.com/view/0685b0af0c1babfbaec05f8d47f52ac9/0685b0af0c1babfbaec05f8d47f52ac91.gif)
![《Python編程基礎與應用》面向對象編程_第2頁](http://file4.renrendoc.com/view/0685b0af0c1babfbaec05f8d47f52ac9/0685b0af0c1babfbaec05f8d47f52ac92.gif)
![《Python編程基礎與應用》面向對象編程_第3頁](http://file4.renrendoc.com/view/0685b0af0c1babfbaec05f8d47f52ac9/0685b0af0c1babfbaec05f8d47f52ac93.gif)
![《Python編程基礎與應用》面向對象編程_第4頁](http://file4.renrendoc.com/view/0685b0af0c1babfbaec05f8d47f52ac9/0685b0af0c1babfbaec05f8d47f52ac94.gif)
![《Python編程基礎與應用》面向對象編程_第5頁](http://file4.renrendoc.com/view/0685b0af0c1babfbaec05f8d47f52ac9/0685b0af0c1babfbaec05f8d47f52ac95.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
2023年11月19日第七章面向對象編程2本章內(nèi)容7.1創(chuàng)建和使用類7.2
私有屬性和私有方法7.3
類屬性和類方法7.4
屬性再研究7.5
繼承7.6
導入類本章將通過多個示例,介紹類的創(chuàng)建及其實例化。還會介紹如何通過繼承來擴展已有類的功能,讓相似的類能夠高效地共享代碼,以及如何把自己編寫的類存儲在模塊中,并在程序文件中導入自己或其他程序員編寫的類。本講內(nèi)容3本章內(nèi)容7.1創(chuàng)建和使用類7.2
私有屬性和私有方法7.3
類屬性和類方法7.4
屬性再研究7.5
繼承7.6
導入類本節(jié)將通過多個示例,介紹類的創(chuàng)建及其實例化。在創(chuàng)建類時,通過“屬性”指定可在實例中存儲什么信息,通過“方法”定義可對這些實例執(zhí)行哪些操作。本講內(nèi)容4第七章面向對象編程7.1創(chuàng)建和使用類第七章面向對象編程中最重要的兩個概念類(Class)對象(Object)
5第七章面向對象編程7.1創(chuàng)建和使用類面向對象編程中最重要的兩個概念類(Class):
類是一系列事物的統(tǒng)稱,同類事物必定具有相同的特征。日常事物的特征根據(jù)特性分為狀態(tài)和行為。在面向對象程序設計中,類是一種面向對象計算機編程語言的結構,它的狀態(tài)被稱為變量,它的行為被稱為方法。6第七章面向對象編程7.1創(chuàng)建和使用類面向對象編程中最重要的兩個概念對象(Object)
對象是類的具體表現(xiàn)形式,是實際存在的個體。一個對象有自己的狀態(tài)、行為和唯一標識。狀態(tài)在編程中表現(xiàn)為屬性,行為在編程中表現(xiàn)為方法。對象的唯一標識用于區(qū)別不同的對象,由編程語言自動管理7第七章面向對象編程7.1創(chuàng)建和使用類面向對象編程中最重要的兩個概念類和對象的關系
所有相同類型的對象所具有的結構和行為在它們共同的類中被定義。類是一系列事物的統(tǒng)稱,對象就是類具體化的實例。對象是類的具體表現(xiàn)形式,是實際存在的個體。8第七章面向對象編程7.1創(chuàng)建和使用類面向對象編程中最重要的兩個概念
類和對象的關系可以用設計圖與具體的產(chǎn)品來類比。假設要設計制造一款汽車,類就是設計圖,而根據(jù)設計圖制造出來的一輛輛汽車就是對象。9第七章面向對象編程7.1創(chuàng)建和使用類面向對象編程中最重要的兩個概念
對象也稱實例(Instance),根據(jù)類創(chuàng)建對象的過程稱為“實例化”。關于術語“對象”和“實例”,可以不加區(qū)別地使用,有的書籍還會合起來稱“對象實例”。下面我們從一個簡單的類——學生(Student)類入手,進入到面向對象編程的世界。學生類不是表示某個特定的學生,而是定義了學生這個群體所具有的特征。一方面是學生所具有的信息,如姓名、年齡等,另一方面是學生的行為,如跑步和打招呼等。學生類讓Python知道如何創(chuàng)建表示特定學生的實例。10第七章面向對象編程7.1創(chuàng)建和使用類7.1.1類的創(chuàng)建
第①行:使用class保留字,定義了一個名為Student的類。第②行:類文檔字符串,與函數(shù)文檔字符串的規(guī)定相同,對這個類的功能進行描述。第③行:在類中定義的函數(shù)稱為方法。創(chuàng)建一個Python文件student.py,代碼如下圖
11第七章面向對象編程7.1創(chuàng)建和使用類7.1.1類的創(chuàng)建
__init__是一個特殊的方法,每當根據(jù)類創(chuàng)建新的實例時,Python都會自動運行它,完成實例的初始化工作。在這個方法的名稱中,開頭和末尾各有兩個下劃線,這是一種約定,旨在避免Python默認方法與普通方法發(fā)生名稱沖突。在其它語言中,該方法通常被稱為構造函數(shù)。創(chuàng)建一個Python文件student.py,代碼如下圖
12第七章面向對象編程7.1創(chuàng)建和使用類7.1.1類的創(chuàng)建
Python創(chuàng)建的每個實例都默認包含一個名為self的變量,它是一個指向實例本身的引用,讓實例能夠訪問自己的屬性和方法。創(chuàng)建一個Python文件student.py,代碼如下圖
13第七章面向對象編程7.1創(chuàng)建和使用類7.1.1類的創(chuàng)建
本例的__init__方法包含三個形參:self、name和age。在這個方法的定義中,形參self必不可少,還必須放在第一個。創(chuàng)建一個Python文件student.py,代碼如下圖
14第七章面向對象編程7.1創(chuàng)建和使用類7.1.1類的創(chuàng)建
第④行:定義變量時使用了前綴self加圓點。以self為前綴的變量可供類中的所有方法使用。=name獲取存儲在形參name中的值,并將其存儲到變量中。用前綴self定義的變量稱為屬性。創(chuàng)建一個Python文件student.py,代碼如下圖
15第七章面向對象編程7.1創(chuàng)建和使用類7.1.1類的創(chuàng)建
第⑤行:Student類還定義了另外兩個方法:run和greet。由于這些方法不需要額外的信息,因此它們只有一個形參self。實際編程中它們應該執(zhí)行有意義的操作,本例中它們只是打印一條說明功能的信息。創(chuàng)建一個Python文件student.py,代碼如下圖
16第七章面向對象編程7.1創(chuàng)建和使用類7.1.2
創(chuàng)建并使用實例
關于主模塊__main__的說明見6.1節(jié)。第⑥行:創(chuàng)建一個名字為Zhang、年齡為19的學生實例。遇到這行代碼時,Python使用實參"Zhang"和19調用Student類中的方法__init__。方法__init__創(chuàng)建一個表示特定學生的實例,并使用提供的值來設置屬性name和age。方法__init__并未顯式地包含return語句,但Python自動返回表示這個學生的實例。本例將這個實例存儲在變量st1中。修改文件student.py,在最后增加如下代碼17第七章面向對象編程7.1創(chuàng)建和使用類7.1.2
創(chuàng)建并使用實例
第⑦行:訪問屬性。要訪問實例的屬性,可使用圓點表示法修改文件student.py,在最后增加如下代碼18第七章面向對象編程7.1創(chuàng)建和使用類7.1.2
創(chuàng)建并使用實例
第⑧行:調用方法。根據(jù)Student類創(chuàng)建實例后,就可以使用圓點表示法調用Student類中的方法修改文件student.py,在最后增加如下代碼19第七章面向對象編程7.1創(chuàng)建和使用類7.1.2
創(chuàng)建并使用實例
此時程序可以執(zhí)行,執(zhí)行結果:20第七章面向對象編程7.1創(chuàng)建和使用類7.1.2
創(chuàng)建并使用實例
可按需求根據(jù)類創(chuàng)建任意數(shù)量的實例。下面再創(chuàng)建一個名為st2的實例。繼續(xù)修改文件student.py,在最后增加代碼:執(zhí)行結果如圖:21第七章面向對象編程7.1創(chuàng)建和使用類7.1.2屬性的默認值
類中的每個屬性都必須有初始值,哪怕這個值是0或者空字符串。前面示例中,屬性的初始值來自__init__方法的參數(shù),在創(chuàng)建實例時指定。另一種方法是無需參數(shù),直接指定初始值,稱為屬性的默認值。22第七章面向對象編程7.1創(chuàng)建和使用類7.1.2屬性的默認值
繼續(xù)修改文件student.py,增加一個默認屬性和兩個方法及其驗證代碼。相關代碼如圖紅框所示23第七章面向對象編程7.1創(chuàng)建和使用類7.1.2屬性的默認值
繼續(xù)修改文件student.py,增加一個默認屬性和兩個方法及其驗證代碼。相關代碼如圖紅框所示24第七章面向對象編程7.1創(chuàng)建和使用類7.1.2屬性的默認值
執(zhí)行結果中增加了:get_credit方法返回學生實例的當前學分,因為新學生還沒有學分,在方法__init__中為屬性self.credit賦默認值為0,一次第一次顯示Zhang的學分為0。add_credit方法修改學生的學分,執(zhí)行后,
Zhang的學分為5。25第七章面向對象編程7.1創(chuàng)建和使用類7.1.2屬性的默認值
具體到本示例,在實例外部直接操作實例的屬性也是可以的,如:26本章內(nèi)容7.1創(chuàng)建和使用類7.2
私有屬性和私有方法7.3
類屬性和類方法7.4
屬性再研究7.5
繼承7.6
導入類本節(jié)介紹什么是私有屬性和私有方法,并通過實例了解其特點。本講內(nèi)容27第七章面向對象編程7.2私有屬性和私有方法
前面提到通過方法來存取實例屬性值是好的編程習慣,但這不是強制措施。如果開發(fā)者認為有必要對此進行強制性限制,比如類的某些屬性只允許在類的內(nèi)部被使用,而不希望在外部被訪問,可使用私有屬性。屬性名以兩個下劃線開頭的屬性稱為私有屬性,私有屬性不能在類的外部被使用或直接訪問28第七章面向對象編程7.2私有屬性和私有方法
創(chuàng)建一個Python文件cup.py,代碼如下第①行:定義了一個屬性__capacity,該屬性以兩個下劃線開頭,為私有屬性,在__init__方法中,也即在類內(nèi)部對其進行訪問沒有問題。第②行:當在類的外部試圖對私有屬性進行訪問時,Python提示沒有該屬性,不允許訪問。
29第七章面向對象編程7.2私有屬性和私有方法
執(zhí)行結果:使用私有屬性是一種明確的保護措施,只有通過類的方法才能對私有屬性進行訪問。
30第七章面向對象編程7.2私有屬性和私有方法
修改文件cup.py,相關代碼為:執(zhí)行結果:300毫升我們增加了get_capacit方法在類的內(nèi)部訪問屬性__capacity。第③行調用該方法,可以得到正確的結果。31本章內(nèi)容7.1創(chuàng)建和使用類7.2
私有屬性和私有方法7.3
類屬性和類方法7.4
屬性再研究7.5
繼承7.6
導入類在Python的面向對象編程中,屬性可以分為實例屬性和類屬性,方法也可分為實例方法和類方法。前兩節(jié)用到的都是實例屬性和方法(無論是否私有),本節(jié)介紹類屬性和類方法。本講內(nèi)容32第七章面向對象編程7.3類屬性和類方法7.3.1
類屬性用self.進行限制的屬性在類的每個實例中都有一個復本,也即同一屬性在每個實例中的取值可以互不相同;即使值相同,在內(nèi)存中也不是同一區(qū)域。與之相對應,直接在類中聲明,而不是在__init__方法中聲明,在聲明時未使用self.的屬性稱為類屬性。無論根據(jù)該類創(chuàng)建了多少實例,類屬性都只有一個復本,即所有實例該屬性的值相等。
33第七章面向對象編程7.3類屬性和類方法7.3.1
類屬性
下面示例創(chuàng)建一個人員(Person)類,并在該類中聲明一個類屬性count記錄人數(shù)。創(chuàng)建一個Python文件person.py,代碼為:34第①行:聲明了一個類屬性,并賦初值為0。第②行:在__init__方法中執(zhí)行count的累加,效果就是每創(chuàng)建一個新實例,該屬性值就加1,達到計數(shù)的效果。第③行:創(chuàng)建Person類的一個實例zhang。第④行:類屬性可以通過類名稱訪問。該行顯示Person.count的值,此時為1。35第⑤行:在創(chuàng)建實例的時候,類屬性會自動配置到每個實例中,即:類屬性也可以通過類的實例訪問。但它不是實例屬性,只是通過實例能夠訪問而已。該行通過實例zhang來訪問類屬性count的值,得到的值同樣為1。第⑥行:后面又創(chuàng)建一個實例wang,此時無論通過哪個實例訪問類屬性count,其值都為2。這也證明類屬性在內(nèi)存中只有一個復本。
36第七章面向對象編程7.3類屬性和類方法7.3.2
析構函數(shù)
__init__方法在實例創(chuàng)建時執(zhí)行實例的初始化工作。與之相對應,Python還支持另外一個__del__方法,它在實例被釋放時自動執(zhí)行,完成實例釋放前的收尾工作。創(chuàng)建一個Python文件person2.py,代碼如下圖所示37運行結果如下:38第①行:定義一個__del__方法。當實例被釋放時,執(zhí)行count的減1操作,保持計數(shù)的正確性。第②行:創(chuàng)建一個實例,之后的print語句顯示Person.count值為1。第③行:用del語句釋放剛創(chuàng)建的實例,之后的print語句顯示Person.count值為0。39第④行:在類外定義一個函數(shù)func()。如5.5節(jié)所述,定義在函數(shù)內(nèi)的變量稱為局部變量,只能在函數(shù)內(nèi)使用,不能在函數(shù)外使用,本例的xu就是一個局部變量。第⑤行:在函數(shù)內(nèi)部創(chuàng)建一個類的實例,之后的print語句顯示此時Person.count的值。40第⑥行:調用函數(shù)func(),執(zhí)行函數(shù)中的創(chuàng)建實例語句和print語句。執(zhí)行函數(shù)中的print語句時實例仍然存在,輸出值為1。第⑦行:此時函數(shù)調用已經(jīng)結束,函數(shù)內(nèi)部創(chuàng)建的局部變量已經(jīng)釋放,此時輸出的Person.count值為0。41第七章面向對象編程7.3類屬性和類方法7.3.3
類方法
與類屬性相對應,Python允許使用@classmethod裝飾器定義屬于類(而不是某個具體實例)的方法。創(chuàng)建一個Python文件person3.py,代碼如下圖所示42運行結果如下:43第①行:使用@classmethod裝飾器,說明隨后的方法為類方法。第②行:類方法必須至少包含一個參數(shù),該參數(shù)表示這個類本身。該參數(shù)名通常用cls,這也是慣例,最好遵守。第③行:在類方法中可以通過cls訪問類屬性。因為類方法只屬于類,而不是屬于某個的實例,所以類方法只能訪問類屬性,不能訪問實例屬性。44第④行:可以通過類名稱調用類方法,調用時不必指明cls參數(shù)值。第⑤行:同樣,在創(chuàng)建實例的時候,類方法也會自動配置到每個實例中,即:類方法也可以通過類的實例調用。但它不是實例方法,只是通過實例能夠調用而已。45第七章面向對象編程7.3類屬性和類方法7.3.4
靜態(tài)方法
與類方法非常相似,Python還允許使用@staticmethod裝飾器定義屬于類(而不是某個具體實例)的靜態(tài)方法。創(chuàng)建一個Python文件person4.py,代碼如下圖所示46運行結果如下:47執(zhí)行結果與person3.py完全相同。可以看出,代碼與person3.py也非常相似,不同之處在于:第①行:使用@staticmethod裝飾器,而不是@classmethod,說明隨后的方法為靜態(tài)方法。第②行:靜態(tài)方法既不需要使用self參數(shù),也不需要使用cls參數(shù)。第③行:雖然沒有cls參數(shù),但靜態(tài)方法仍然可以使用類名訪問類屬性。與類方法相同,靜態(tài)方法也不能訪問實例屬性。48下面討論兩個與面向對象編程概念相關的小專題。1.類方法與靜態(tài)方法嚴謹?shù)腜ython程序員會人為地對類方法和靜態(tài)方法加以區(qū)分:需要使用類屬性時,通常使用類方法。在靜態(tài)方法中通常不使用類屬性,也不需要調用其它的方法;在這種情況下,靜態(tài)方法只是個獨立的、單純的函數(shù),僅僅是將這類函數(shù)托管于某個類的名稱空間中,使程序更清晰,便于使用和維護。49下面討論兩個與面向對象編程概念相關的小專題。2.函數(shù)與方法的區(qū)別函數(shù)是由函數(shù)名引用的一個獨立對象,通過函數(shù)名稱可以調用這個對象,不依賴于其它。而方法依賴于類,因為它在類中定義,如果要調用它,必須通過類或者類的實例。在調用函數(shù)時,必須為每個形參提供實參值。而方法的self和cls參數(shù),在調用時則不需要顯式地提供實參值。50本章內(nèi)容7.1創(chuàng)建和使用類7.2
私有屬性和私有方法7.3
類屬性和類方法7.4
屬性再研究7.5
繼承7.6
導入類屬性是類定義的核心內(nèi)容,大多數(shù)方法為了操作和管理屬性而存在。前面已經(jīng)介紹了如何在__init__方法中對屬性進行初始化,以及如何在類的內(nèi)部和外部訪問屬性值,本節(jié)進一步討論與屬性相關的其它內(nèi)容,包括屬性的增加與刪除,以及@property裝飾器。本講內(nèi)容51第七章面向對象編程7.4
屬性再研究7.4.1
屬性的增加與刪除
屬性通常在類的定義中說明,這樣的程序結構更清晰。但如果確實需要,類屬性和實例屬性都可以動態(tài)地增加和刪除。創(chuàng)建一個Python文件foo.py,代碼如下:52運行結果如下:53第①行:定義一個沒有任何內(nèi)容的類Foo。第②行:創(chuàng)建Foo的一個實例f1。第③行:增加一個類屬性并賦值。第④⑤行:分別通過類和實例訪問類屬性,所得值相同。54第⑥行:再創(chuàng)建一個實例f2,通過該實例訪問類屬性,所得值相同,說明類屬性只有一個復本。第⑦行:為f1增加一個實例屬性并賦值,然后就可以通過實例訪問該實例屬性。55第⑧行:如果去掉注釋,這兩行會報錯。無論是通過類還是通過其它實例,都無法訪問該實例屬性,該屬性只屬于實例f1。第⑨⑩行:可以使用del語句刪除類屬性和實例屬性。56第七章面向對象編程7.4
屬性再研究7.4.2
@property裝飾器
對象的狀態(tài)通常由屬性來表達,但有的狀態(tài)需要通過計算獲得,此時就需要使用方法。為了增加訪問對象狀態(tài)的方便性,Python內(nèi)置的@property裝飾器可以把一個方法轉變成屬性,使調用者可以直接通過轉變后的屬性取值或賦值。創(chuàng)建一個Python文件square.py,代碼如下:57運行結果如下:58本例定義一個正方形類。第①行:在__init__方法中為邊長賦初值。第②行:@property裝飾器將后續(xù)的area方法轉化為屬性。第③行:area方法的功能是根據(jù)邊長求正方形的面積。第④行:@setter裝飾器將后續(xù)的方法轉化為屬性設置函數(shù)。59第⑤行:屬性設置函數(shù),調用形式為“實例.屬性=值”。本例的功能是根據(jù)面積求出邊長。第⑥行:創(chuàng)建一個正方形實例s1,其邊長為2,然后通過屬性area取其面積并打印。第⑦行:設置正方形的面積為9,然后顯示該正方形的邊長。60本章內(nèi)容7.1創(chuàng)建和使用類7.2
私有屬性和私有方法7.3
類屬性和類方法7.4
屬性再研究7.5
繼承7.6
導入類繼承(Inheritance)是面向對象編程的重要概念,也是面向對象編程最主要的優(yōu)越性之一。本章前面都是從無到有地編寫類,其實并不總是需要這樣。本節(jié)將介紹繼承的概念和使用方法。本講內(nèi)容61第七章面向對象編程7.5
繼承
繼承(Inheritance)是面向對象編程的重要概念,也是面向對象編程最主要的優(yōu)越性之一。一個類繼承另一個類時,它將自動獲得另一個類的所有屬性和方法;原有的類稱為父類或基類,而新類稱為子類或派生類。子類繼承了其父類的所有屬性和方法,同時還可以定義自己的屬性和方法。62第七章面向對象編程7.5
繼承7.5.1
簡單的繼承
前面我們編寫了學生類。有些學生具有體育或文藝方面的特長,稱為特長生。描述特長生時,除了說明一般學生具有的姓名、年齡等屬性和跑步等方法外,還要對其特長進行說明。為這類特長生編寫類時,就不需要從空白開始,而是可以從原有的學生類繼承。創(chuàng)建一個Python文件special_student.py,代碼如下:63運行結果如下:64第①行:使用class保留字,定義一個名為SpecialStudent的類。與前面的定義不同,本例在類名之后使用括號,指明從Student類繼承。Student是父類,SpecialStudent是子類。后面使用pass語句,在子類中不定義任何功能。65第②行:創(chuàng)建SpecialStudent類的一個實例。在本例中,子類完全繼承父類的特性,與創(chuàng)建Student類實例相同,傳入?yún)?shù)"Zhang"和19。第③行:此處調用的,實際上是從父類繼承的run方法。66第七章面向對象編程7.5繼承7.5.2
重寫父類的方法
之所以使用繼承,肯定是子類與父類有所有同,如前節(jié)的簡單繼承是沒有意義的。假設要說明體育特長生“跑得更快”這個事實,可以通過重寫父類的方法實現(xiàn)。修改文件special_student.py,代碼如下:67運行結果如下:68第①行:在子類中重寫了方法run。第②行:此處調用的,是子類的run方法。本例說明,通過重寫父類的方法,改變了實例的行為,子類的方法覆蓋了父類的方法。69第七章面向對象編程7.5
繼承7.5.3
重寫__init__方法
如果想在創(chuàng)建子類實例時對子類做一些特殊的初始化工作,需要重寫__init__方法。如前所示,子類中重寫方法會覆蓋父類的同名方法,此時,如果父類的初始化工作也需要做,有兩種方法,一種是把父類__init__方法的代碼復制到子類中,但樣寫出來的程序可維護性差。常用的方法是在子類的__init__方法中除完成本身的初始化工作外,還要調用父類的__init__方法,完成父類的初始化工作。繼續(xù)修改文件special_student.py,相關代碼為:70運行結果如下:71第①行:在子類中重寫了方法__init__。第②行:調用父類的__init__方法。在Python中,super()函數(shù)返回對父類的引用。第③行:完成子類本身的初始化工作,本例僅僅是打印一條信息。第④行:不僅是__init__方法,其它方法中也可以通過super()函數(shù)訪問父類的方法。
72第⑤行:在創(chuàng)建SpecialStudent類的實例時,先調用子類的__init__方法。子類的__init__方法又會調用父類的__init__方法,對姓名和年齡做初始化,然后打印信息說明創(chuàng)建的是特長生實例。本例演示了對父類方法的調用。73第七章面向對象編程7.5
繼承7.5.4
為子類增加新的屬性和方法
子類作為父類的特殊情況,通常具有更多的屬性和方法。下面示例假設需要記錄每個特長生的具體特長,還要對特長生進行介紹。繼續(xù)修改文件special_student.py,相關代碼為:74運行結果如下:75第①行:在子類中增加了一個新的屬性self.special,記錄特長生的具體特長。注意,此時的__init__方法多了一個參數(shù)。第②行:在子類中定義了一個新的方法introduce,這個方法在父類中是沒有的,是特長生的特殊功能。第③行:調用子類特有的方法introduce。
76第七章面向對象編程7.5繼承7.5.5多重繼承
繼承是面向對象編程的重要概念,多重繼承是繼承的特殊形式。初學者對多重繼承的概念可能難以理解,本小節(jié)先介紹多重繼承存在的必要性,然后簡單介紹Python對多重繼承的實現(xiàn)機制,不涉及具體示例。77第七章面向對象編程繼承多重繼承
之所以要使用多重繼承,主要有兩方面的必要性。內(nèi)在含義的必要性:比如前面特長生類繼承自學生類的示例是單重繼承。假設有兩個基類,學生類和運動員類,而體育特長生同時具有學生和運動員的特征,就可以同時從學生類和運動員類多重繼承。78第七章面向對象編程繼承多重繼承
之所以要使用多重繼承,主要有兩方面的必要性。外在功能的必要性:比如本書第15章將要介紹的GraphicsObject類,從GraphicsItem和QGraphicsObject類多重繼承,從GraphicsItem類繼承繪圖功能,從QGraphicsObject類繼承PyQt的信號/槽機制,從而增強繪圖界面的交互性。79第七章面向對象編程7.5繼承7.5.6
多重繼承
Python有限地支持多重繼承,下面是一個多重繼承的類定義示例:80第七章面向對象編程7.5繼承7.5.6抽象類和抽象方法
抽象類是面向對象編程的基本概念。抽象類是一種特殊的類,它只能被繼承,而自己不能被實例化。比如要定義豬、狗等類,可以先定義一個動物類,然后豬、狗等類都從動物類繼承。豬和狗都可以實例化,它們都可以有名字,都可以吃,但“動物”卻是一個抽象的概念,不能被實例化。此時就可以將動物定義成抽象類,它有eat方法,但不需要實現(xiàn),稱為抽象方法,抽象方法在子類中必須實現(xiàn)。81第七章面向對象編程7.5繼承7.5.6抽象類和抽象方法
Python本身不支持抽象類,但可以使用Python自帶的abc模塊來實現(xiàn)抽象類的功能。創(chuàng)建一個Python文件animal.py,代碼為:82運行結果如下:83第①行:從abc模塊中導入ABC和abstractmethod。ABC(AbstractBaseClass,抽象基類),所有的抽象類都必須從此類繼承。abstractmethod裝飾器定義抽象方法。第②行:定義一個抽象類Animal。第③部分:定義一個抽象方法eat。在抽象類中此方法不需要實現(xiàn),所以只有一句pass。84第④部分:定義一個繼承自Animal的子類Pig。在Pig中應該實現(xiàn)方法eat;如果沒有實現(xiàn),那Pig就仍然是抽象類,不能被實例化,只能被繼承。第⑤行:創(chuàng)建一個Pig實例pig1。第⑥行:調用pig1的eat方法。85第七章面向對象編程7.5繼承7.5.6抽象類和抽象方法
在編程實踐中,使用抽象類可以帶來多方面的好處。如上面示例,在編寫抽象類Animal時,可以只關注當前抽象類的方法和描述,而不需要過多考慮實現(xiàn)細節(jié),這對協(xié)同開發(fā)有很大意義,也讓代碼可讀性更高。另外,在不同的模塊中通過抽象基類來調用,可以用最精簡的方式展示代碼的邏輯關系,而不必關心對象的具體類型。修改文件animal.py,增加如下代碼:86第⑦行:定義一個函數(shù)animal_eat(),它接受一個參數(shù)a,通過函數(shù)注釋的方式說明參數(shù)a的類型是一個Animal類的實例。Animal類不能被實例化,但這樣寫沒問題,因為Python不會對函數(shù)注釋進行檢查87第⑧行:調用a的eat方法。這里不用管a是Pig還是Dog,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合同大寫金額標準寫法
- DB6103T 83-2025巨菌草栽培技術規(guī)范
- 產(chǎn)業(yè)園區(qū)綜合服務與物業(yè)管理合同
- 2025年環(huán)保技術項目研發(fā)合同
- 上海居民住房租賃合同細則
- 專利許可使用權轉讓合同
- 2025年借款合同范本:生活資金周轉專用
- 產(chǎn)權清楚的商業(yè)車位買賣合同
- 三方人才派遣合同模板
- 互聯(lián)網(wǎng)眾籌合作合同范本(修訂)
- 如愿三聲部合唱簡譜
- 高三數(shù)學開學第一課
- 水生野生動物保護與管理
- 115個低風險組病種目錄
- 系統(tǒng)解剖學考試重點筆記
- 暖通空調基礎知識及識圖課件
- 防滲墻工程施工用表及填寫要求講義
- 交通信號控制系統(tǒng)檢驗批質量驗收記錄表
- 校園信息化設備管理檢查表
- 新版抗拔樁裂縫及強度驗算計算表格(自動版)
- API SPEC 5DP-2020鉆桿規(guī)范
評論
0/150
提交評論