版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
知識(shí)目標(biāo)了解面向?qū)ο蟮幕靖拍詈驮O(shè)計(jì)原則。理解類和對(duì)象的關(guān)系和相關(guān)語(yǔ)法。理解類的繼承關(guān)系。理解對(duì)象的序列化和反序列化。能力目標(biāo)能從任務(wù)中準(zhǔn)確地分析出類,并設(shè)計(jì)它們之間的關(guān)系。能根據(jù)設(shè)計(jì)正確地編寫類代碼,根據(jù)已有類創(chuàng)建實(shí)例并使用類和實(shí)例。素養(yǎng)目標(biāo)能運(yùn)用科學(xué)的思維方式認(rèn)識(shí)世界,在復(fù)雜環(huán)境中正確分析事物間關(guān)系,制定合理的解決方案并最終解決問(wèn)題。感受科技之美,深刻意識(shí)到科技造福人類,創(chuàng)新引領(lǐng)未來(lái),努力學(xué)習(xí),奮發(fā)圖強(qiáng)。項(xiàng)目十、模擬智能機(jī)房管理
項(xiàng)目描述項(xiàng)目描述
智能化系統(tǒng)是由現(xiàn)代通信與信息技術(shù)、計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)、行業(yè)技術(shù)、智能控制技術(shù)等匯集而成的針對(duì)某一個(gè)方面的應(yīng)用的智能集合。隨著信息技術(shù)的不斷發(fā)展,智能化的概念逐漸滲透到各行各業(yè)以及我們生活中的方方面面。本項(xiàng)目完成學(xué)校機(jī)房的模擬智能化管理。
學(xué)?,F(xiàn)有多個(gè)機(jī)房,各機(jī)房的信息存儲(chǔ)在以機(jī)房編號(hào)命名的csv文件中。目前可以智能控制管理的設(shè)備包括電子門(帶密碼)和電腦,后續(xù)會(huì)新增其他設(shè)備。這些設(shè)備均有是否可運(yùn)行和是否在運(yùn)行的兩個(gè)狀態(tài)參數(shù)。設(shè)備若有故障,則可運(yùn)行狀態(tài)為否。所有設(shè)備都支持開(kāi)啟和關(guān)閉。電腦支持重啟。門支持重設(shè)密碼。編寫程序?qū)崿F(xiàn)對(duì)機(jī)房的智能化管理。
下頁(yè)的圖是501和502兩個(gè)機(jī)房的初始狀態(tài),各行包括設(shè)備類型、設(shè)備編號(hào)、是否可用、當(dāng)前是否運(yùn)行中,如果是門,則還有六位數(shù)字密碼(默認(rèn)“000000”)的md5密文。
項(xiàng)目描述項(xiàng)目描述
項(xiàng)目分析項(xiàng)目分析
項(xiàng)目涉及到多個(gè)事物,機(jī)房、電腦、門,后續(xù)還可能有新增設(shè)備,可以用面向?qū)ο蟮乃枷脒M(jìn)行設(shè)計(jì)和管理。考慮各類設(shè)備的共性和獨(dú)特性,可以提取基類并通過(guò)繼承進(jìn)行設(shè)計(jì)。門密碼用md5加密算法進(jìn)行存儲(chǔ)和核對(duì),可尋求Python相應(yīng)模塊的幫助。
知識(shí)準(zhǔn)備10.1面向?qū)ο?0.2類的成員變量10.3類的成員方法10.4成員的訪問(wèn)控制權(quán)限10.5類的繼承10.6進(jìn)一步探討10.1面向?qū)ο?0.1.1從面向過(guò)程到面向?qū)ο?/p>
簡(jiǎn)單數(shù)據(jù)
結(jié)構(gòu)體
類
面向過(guò)程
面向?qū)ο?/p>
面向過(guò)程和面向?qū)ο蠖际蔷帉懗绦虻乃季S方式,前者注重按流程完成任務(wù),核心在于函數(shù)的設(shè)計(jì);后者注重任務(wù)中對(duì)象之間的關(guān)系,核心在于對(duì)數(shù)據(jù)和函數(shù)的封裝。
小規(guī)模問(wèn)題可以使用面向過(guò)程,按照步驟實(shí)現(xiàn)任務(wù);復(fù)雜問(wèn)題可以使用兩者相結(jié)合,宏觀上使用面向?qū)ο蟀盐?,微觀處理上仍然是面向過(guò)程。10.1面向?qū)ο?0.1.2什么是面向?qū)ο?Python中一切皆對(duì)象(object)。面向?qū)ο蟮娜齻€(gè)基本原則是封裝性、繼承性和多態(tài)性。
類對(duì)象,簡(jiǎn)稱類(class),是對(duì)現(xiàn)實(shí)世界中一些事物的模擬描述,它定義了同類事物共有的狀態(tài)和行為。實(shí)例對(duì)象,簡(jiǎn)稱實(shí)例(instance),是根據(jù)類所創(chuàng)建出來(lái)的具體對(duì)象。也就是說(shuō),類是設(shè)計(jì)實(shí)例的模板,根據(jù)這個(gè)模板可以創(chuàng)建出多個(gè)實(shí)例。類和實(shí)例是一對(duì)多的關(guān)系。 Python的各數(shù)據(jù)類型,如int、float、str、list都是類對(duì)象,其數(shù)據(jù)類型是type,也就是說(shuō)type是個(gè)模具類,所有的class都是根據(jù)type類創(chuàng)建出來(lái)的類對(duì)象。而,x、y、z這些變量都是根據(jù)這些class類對(duì)象創(chuàng)建的實(shí)例對(duì)象。
函數(shù)也是對(duì)象。10.1面向?qū)ο?0.1.3類的設(shè)計(jì)
類的設(shè)計(jì)思路主要包括三點(diǎn)。從應(yīng)用中提取同類事物(找名詞)并為之設(shè)計(jì)類名。類名建議用英文單詞。提取同類事物共有的屬性并轉(zhuǎn)化為類的成員變量。提取同類事物共有的行為并轉(zhuǎn)化為類的成員方法。10.1面向?qū)ο蟆痉独?0.1】e_circle.py
有一面白墻,需要在上面進(jìn)行圖形的繪制,假設(shè)需要繪制多個(gè)天藍(lán)色大小不一的圓形,并用彩條貼邊。那么我們需要記錄墻上所有圓形的位置和半徑,計(jì)算所有圓的面積來(lái)確定藍(lán)色顏料的使用量,計(jì)算所有圓的周長(zhǎng)來(lái)確定彩條的用量。以墻的左下角為原點(diǎn)(0,0),圓1坐標(biāo)(10,5)且半徑5;圓2坐標(biāo)(15,12)且半徑8;圓3坐標(biāo)(30,7)且半徑3。
此應(yīng)用中有多個(gè)圓,它們屬于同類事物,可以提取它們的共性并設(shè)計(jì)圓類。該類記錄圓的坐標(biāo)和半徑并能計(jì)算周長(zhǎng)和面積。統(tǒng)計(jì)圓的總個(gè)數(shù)以方便繪制時(shí)的情況跟蹤。10.1面向?qū)ο?0.1.4類的實(shí)例化及其應(yīng)用
創(chuàng)建。self指向?qū)嵗旧?,無(wú)需傳遞數(shù)據(jù)。使用。引用操作符即“.”用于操作類和實(shí)例的成員,具體格式是“類.成員”或者“實(shí)例.成員”。刪除。del命令用于釋放實(shí)例,它將調(diào)用__del__()方法。記錄實(shí)例總個(gè)數(shù)的類變量circleCount會(huì)隨著實(shí)例的刪除而被調(diào)整?!痉独?0.1】e_circle.py----繼續(xù)往后分析10.1面向?qū)ο?0.1.5調(diào)試面向?qū)ο蟮某绦?/p>
10.1面向?qū)ο笸接?xùn)練1.仿照e_circle.py編寫程序p_rectangle.py。
(1)實(shí)現(xiàn)類Rectangle,類變量rectCount,初值為0,統(tǒng)計(jì)Rectangle實(shí)例的個(gè)數(shù);實(shí)例變量包括中心坐標(biāo)(x,y),寬w,高h(yuǎn);行為包括:計(jì)算周長(zhǎng),計(jì)算面積;構(gòu)造方法類似于Circle傳入坐標(biāo)和寬高;析構(gòu)方法也類似,修改rectCount。
(2)編寫main函數(shù),創(chuàng)建Rectangle實(shí)例J,坐標(biāo)(10,20),寬100,高50,顯示實(shí)例J的周長(zhǎng)和面積。
(3)獨(dú)立運(yùn)行程序時(shí)調(diào)用main函數(shù)。2.編寫程序p_rects.py。導(dǎo)入p_rectangle.py,反復(fù)讀入各矩形的信息直到輸入為空。創(chuàng)建對(duì)應(yīng)的各個(gè)矩形實(shí)例并添加到列表中。計(jì)算并顯示列表中所有矩形的面積和與周長(zhǎng)和。10.2類的成員變量10.2.1成員變量的分類 Python類的成員變量根據(jù)其作用域分為類變量和實(shí)例變量。
(1)類變量。類變量指直接在類體中定義的變量,它將在這個(gè)類的所有實(shí)例之間共享,通過(guò)“類.類變量”進(jìn)行訪問(wèn)。也可以在類體外也可以通過(guò)賦值“類.類變量”創(chuàng)建新的類變量。
類體外也可以通過(guò)“實(shí)例.類變量”讀取實(shí)例所屬的類的類變量。但是當(dāng)使用“實(shí)例.同名變量”進(jìn)行值設(shè)置時(shí)將會(huì)為實(shí)例產(chǎn)生新的實(shí)例變量,而不是修改所屬類的類變量。因此,為了防止與實(shí)例變量混淆,不建議使用“實(shí)例.類變量”。
(2)實(shí)例變量。實(shí)例變量指在類體中通過(guò)“self.實(shí)例變量”定義的屬性。它屬于特定的實(shí)例,在類的內(nèi)部通過(guò)“self.實(shí)例變量”進(jìn)行訪問(wèn),在類體外通過(guò)“實(shí)例.實(shí)例變量”進(jìn)行訪問(wèn)。也可以在類體外通過(guò)賦值“實(shí)例.實(shí)例變量”創(chuàng)建屬于本實(shí)例的實(shí)例變量。10.2類的成員變量【范例10.2】e_useCircle_1.py【范例10.3】e_useCircle_2.py【思考】(1)如果去掉第11、18行的注釋符號(hào),你能預(yù)估這兩行代碼顯示的這些地址數(shù)據(jù)的同異么?并分析原因。(2)如果程序最后加上一行“print()”,運(yùn)行效果是什么?為什么?【范例10.4】e_useCircle_3.py10.2類的成員變量10.2.2函數(shù)相關(guān)操作 Python允許添加、刪除、判斷是否存在、修改、獲取類和實(shí)例的成員。下表給出一組函數(shù),用于訪問(wèn)類和實(shí)例的成員。這組方法適用于成員變量也適用于成員方法。序號(hào)函數(shù)功能描述1getattr(obj,name[,default])訪問(wèn)obj的成員name。2hasattr(obj,name)返回obj是否有成員name。3setattr(obj,name,value)設(shè)置obj的成員name的值為value。4delattr(obj,name)刪除obj的成員name。【范例10.5】e_useCircle_4.py10.2類的成員變量10.2.3類的內(nèi)置成員變量
【范例10.6】e_dog.py序號(hào)內(nèi)置類變量功能描述1__dict__包含類命名空間的字典。2__name__類的名稱。3__module__類定義所在模塊的名稱。4__bases__包含基類的元組,按它們?cè)诨惲斜碇械某霈F(xiàn)先后排序。5__base__基類。6__class__實(shí)例對(duì)應(yīng)的類。7__doc__類的文檔字符串,如果未定義則為None。10.2類的成員變量同步訓(xùn)練1.編寫p_circle.py,提供Circle類,除了e_circle.py中的成員,還添加如下方法。(1)setColor(self,c),設(shè)置顏色屬性color的值為c;(2)getColor(self,c),獲取顏色屬性color,如果沒(méi)有該屬性,則返回None;(3)draw(self,t),小烏龜t繪制圓,如果已有color屬性,則用其值(畫完恢復(fù)t原來(lái)的顏色),否則用t的當(dāng)前顏色。2.編寫p_drawcircles.py。導(dǎo)入p_circle.py的Circle類,創(chuàng)建三個(gè)Circle實(shí)例:c1(0,0,50),顏色為’blue’;c2(0,0,80),無(wú)顏色屬性;c3(0,0,110),顏色為’red’;。繪制這三個(gè)圓。運(yùn)行效果如圖所示。10.3類的成員方法10.3.1方法的分類 Python類的成員方法分為實(shí)例方法、類方法和靜態(tài)方法。
(1)實(shí)例方法
實(shí)例方法的首參數(shù)名是self,指向?qū)嵗刂罚{(diào)用時(shí)該參數(shù)不用傳值,Python將自動(dòng)把實(shí)例地址傳遞給該參數(shù)。
實(shí)例方法中可以使用類變量和實(shí)例變量。
調(diào)用實(shí)例方法使用實(shí)例.實(shí)例方法([參數(shù)列表])或類.實(shí)例方法(實(shí)例[,參數(shù)列表])。
假設(shè)有類A和它的實(shí)例b。b.func(p1,p2)被調(diào)用時(shí),Python自動(dòng)將其轉(zhuǎn)換為A.func(b,p1,p2),將實(shí)例b傳遞給方法頭部的self,這就是為什么不用給self傳值。10.3類的成員方法10.3.1方法的分類 Python類的成員方法分為實(shí)例方法、類方法和靜態(tài)方法。
(2)類方法
類方法使用裝飾器@classmethod進(jìn)行定義。類方法的第一個(gè)參數(shù)是cls,即類對(duì)象,調(diào)用時(shí)該參數(shù)不用傳值,Python將自動(dòng)把類對(duì)象傳遞給該參數(shù)。
類方法屬于類而不是實(shí)例,使用cls.類成員或類.類成員訪問(wèn)類成員,不能訪問(wèn)實(shí)例成員。
類方法的調(diào)用形式是
類.類方法()。
也可以通過(guò)實(shí)例.類方法()進(jìn)行訪問(wèn),但是不建議這樣使用。
(3)靜態(tài)方法
靜態(tài)方法使用裝飾器@staticmethod進(jìn)行定義。靜態(tài)方法往往不直接依賴于類和實(shí)例。
靜態(tài)方法不能訪問(wèn)實(shí)例成員。但可以通過(guò)類.類成員訪問(wèn)類成員。
靜態(tài)方法的調(diào)用形式是類.靜態(tài)方法()。
也可以在類體外通過(guò)實(shí)例.靜態(tài)方法()訪問(wèn),但是不建議這樣使用。10.3類的成員方法10.3.1方法的分類
這三類方法的對(duì)比分析如下。
從形式上來(lái)說(shuō),在類中定義實(shí)例方法時(shí)必須添加self;定義類方法時(shí)需要傳遞參數(shù)cls;定義靜態(tài)方法時(shí)不需要傳遞任何類和實(shí)例的信息。
從意義上來(lái)說(shuō),實(shí)例方法和類方法都與實(shí)例和類本身有著緊密的聯(lián)系,而靜態(tài)方法主要是用來(lái)存放邏輯性的代碼,即邏輯上屬于類,但是和類本身沒(méi)有交互,即在靜態(tài)方法中,不會(huì)涉及到類的成員方法和成員變量的操作??梢岳斫鉃閷㈧o態(tài)方法存在此類的名稱空間中。事實(shí)上,在python引入靜態(tài)方法之前,通常是在全局名稱空間中創(chuàng)建函數(shù)?!痉独?0.7】e_comparemethods.py【范例10.8】e_time.py10.3類的成員方法導(dǎo)入:【范例10.9】e_pets.py10.3.2類的內(nèi)置方法
類的內(nèi)置方法非常多,這里挑選出部分進(jìn)行分類介紹。通過(guò)重寫這些方法可以實(shí)現(xiàn)用戶自定義的新功能。各表分別給出類的構(gòu)造和析構(gòu)方法、類的各種表示形式、類的數(shù)學(xué)運(yùn)算、類的關(guān)系運(yùn)算、類的強(qiáng)制類型轉(zhuǎn)換和類的序列化操作。序號(hào)內(nèi)置方法功能描述1__new__(cls[,...])創(chuàng)建實(shí)例,并把cls之外的其他參數(shù)傳給__init__()。一般不需要重寫該方法。2__init__(self[,...])初始化實(shí)例。創(chuàng)建實(shí)例后將調(diào)用__init__()進(jìn)行實(shí)例的初始化。3__del__(self)實(shí)例將被銷毀時(shí)調(diào)用該方法。類的構(gòu)造和析構(gòu)10.3類的成員方法10.3.2類的內(nèi)置方法----類的各種表示形式
序號(hào)內(nèi)置方法功能描述1__str__(self)當(dāng)使用str()、format()和print()操作于實(shí)例時(shí)該方法將會(huì)被調(diào)用,返回一個(gè)str。2__repr__(self)當(dāng)使用repr()操作于實(shí)例時(shí)被調(diào)用,返回一個(gè)str。3__unicode__(self)當(dāng)使用unicode()操作于實(shí)例時(shí)被調(diào)用,返回一個(gè)unicode字符串。4__format__(self,
format_spec)通過(guò)format()內(nèi)置函數(shù)、擴(kuò)展、格式化字符串字面值的求值以及str.format()方法調(diào)用以生成一個(gè)對(duì)象的“格式化”字符串表示。5__bytes__(self)當(dāng)使用bytes()操作于實(shí)例時(shí)被調(diào)用,返回一個(gè)bytes字節(jié)串。6__hash__(self)當(dāng)使用hash()操作于實(shí)例時(shí)被調(diào)用,返回一個(gè)整數(shù),其結(jié)果會(huì)被用于字典中鍵的快速比較。7__dir__(self)當(dāng)使用dir()操作于實(shí)例時(shí)被調(diào)用,返回一個(gè)序列。8__len__(self)當(dāng)使用len()操作于實(shí)例時(shí)被調(diào)用,返回對(duì)象的長(zhǎng)度(int且>=0)。10.3類的成員方法10.3.2類的內(nèi)置方法----類的數(shù)學(xué)運(yùn)算
序號(hào)內(nèi)置方法功能描述1__add__(self,other)實(shí)現(xiàn)self+other。2__sub__(self,other)實(shí)現(xiàn)self-other。3__mul__(self,other)實(shí)現(xiàn)self*other。4__floordiv__(self,other)實(shí)現(xiàn)self//other。5__truediv__(self,other)實(shí)現(xiàn)self/other。6__mod__(self,other)實(shí)現(xiàn)self%other。7__divmod__(self,other)實(shí)現(xiàn)divmod(self,other)。8__pow__(self,
other[,
modulo])實(shí)現(xiàn)pow(self,other)。9__lshift__(self,
other)實(shí)現(xiàn)self<<other。10__rshift__(self,
other)實(shí)現(xiàn)self>>other。11__and__(self,
other)實(shí)現(xiàn)self&other。12__xor__(self,
other)實(shí)現(xiàn)self^other。13__or__(self,
other)實(shí)現(xiàn)self|other。10.3類的成員方法10.3.2類的內(nèi)置方法----類的關(guān)系運(yùn)算
序號(hào)內(nèi)置方法功能描述1__gt__(self,other)定義大于操作符的行為,判斷self是否>other2__lt__(self,other)定義小于操作符的行為,判斷self是否<other3__ge__(self,other)定義大于等于操作符的行為,判斷self是否>=other4__le__(self,other)定義小于等于操作符的行為,判斷self是否<=other5__eq__(self,other)定義判斷等于操作符的行為,判斷self是否==other6__ne__(self,other)定義不等于操作符的行為,判斷self是否!=other10.3類的成員方法10.3.2類的內(nèi)置方法----類的強(qiáng)制類型轉(zhuǎn)換
序號(hào)內(nèi)置方法功能描述1__bool__(self)使用bool()操作于實(shí)例時(shí)該方法將被調(diào)用,返回值為True或False。2__int__(self)使用int()操作于實(shí)例時(shí)該方法將被調(diào)用,返回一個(gè)int。3__complex__(self)使用complex()操作于實(shí)例時(shí)該方法將被調(diào)用,返回一個(gè)complex。4__float__(self)使用float()操作于對(duì)象時(shí)該方法將被調(diào)用,返回一個(gè)float。10.3類的成員方法10.3.2類的內(nèi)置方法----類的序列化操作
序號(hào)內(nèi)置方法功能描述1__getitem__(self,key)實(shí)現(xiàn)self[key]的求值。如果key的類型不正確則會(huì)引發(fā)TypeError異常;如果key不在序列索引集范圍內(nèi)則應(yīng)引發(fā)IndexError異常。如果key符合映射類型但是不在容器中則應(yīng)引發(fā)KeyError異常。2__setitem__(self,key)實(shí)現(xiàn)向self[key]賦值。注意事項(xiàng)與__getitem__()相同。3__reversed__(self)調(diào)用reversed()操作于實(shí)例時(shí)將使用該方法,返回一個(gè)新的以逆序逐個(gè)迭代容器內(nèi)所有對(duì)象的迭代器對(duì)象?!痉独?0.10】e_dogclass.py10.3類的成員方法同步訓(xùn)練1.編寫程序p_catclass.py,仿照e_dogclass.py中的Dog定義Cat類,要求如下。
(1)初始設(shè)定name、age和eyecolor(默認(rèn)值“green”)的實(shí)例屬性;
(2)實(shí)例方法setEyecolor()和getEyecolor(),設(shè)置和獲取屬性eyecolor;
(3)實(shí)例方法eat(),顯示:“喵喵!”+貓名+“要吃魚”;
(4)實(shí)例方法catchMouse(),顯示:貓名+“正在抓老鼠”;
(5)重寫__str__(),顯示實(shí)例信息,包括貓名、年齡和眼睛顏色;
(6)為Cat類添加按年齡比大小的操作。2.編寫程序p_petfamily.py,導(dǎo)入e_dogclass.py的Dog和p_catclass.py的Cat,創(chuàng)建3個(gè)Dog實(shí)例和2個(gè)Cat實(shí)例,讀入它們的信息,分別存入dogs和cats兩個(gè)列表中并進(jìn)行排序,顯示貓和狗各自的排序以及它們合在一起的排序?!舅伎肌繛槭裁碊og實(shí)例和Cat實(shí)例可以合并排序?10.4成員的訪問(wèn)控制權(quán)限成員的訪問(wèn)控制權(quán)限 Python類的成員從權(quán)限上分為私有的(private)、公有的(public)和受保護(hù)的(protected)。
首先是書寫形式上的區(qū)分。以兩個(gè)下劃線開(kāi)頭但不以兩個(gè)下劃線結(jié)束的是私有的,單下劃線開(kāi)始的是受保護(hù)的,其他的為公有的。受保護(hù)的變量和方法用于類的繼承,稍后再討論。
其次是訪問(wèn)方式上的區(qū)分。公有成員可以在類的外部直接訪問(wèn)。私有成員在類的外部不能直接訪問(wèn),但是可以間接進(jìn)行存取。通常情況下,如果要在類的外部訪問(wèn)私有成員__x,類體中應(yīng)該相應(yīng)地提供getx()和setx()進(jìn)行獲取和設(shè)置。10.4成員的訪問(wèn)控制權(quán)限【范例10.11】e_product_error.py
已知某產(chǎn)品類Product,記錄出售了多少個(gè)產(chǎn)品和本款產(chǎn)品的保修年限,對(duì)于每個(gè)出售的產(chǎn)品,要記錄出售編號(hào)(從1開(kāi)始)、購(gòu)買者姓名、購(gòu)買者電話。找出下面代碼的幾處錯(cuò)誤并進(jìn)行修改?!痉独?0.12】e_product_v1.py
為了保證不能在類體外訪問(wèn)私有變量,Python會(huì)在類的內(nèi)部自動(dòng)地把我們定義的__spam替換成為_(kāi)classname__spam。用戶在外部訪問(wèn)__spam的時(shí)候就會(huì)提示找不到相應(yīng)的變量。例如,類A有個(gè)私有變量__s,那么__s在內(nèi)部會(huì)被替換成_A__s。實(shí)際上,python中的私有變量和私有方法仍然是可以訪問(wèn)的。
【注意】Python并沒(méi)有真正的私有化支持,下劃線得到的是偽私有。【范例10.13】e_product_v2.py【范例10.14】e_methods_error.py10.5類的繼承10.5.1基本概念
類的編寫并非總要從空白開(kāi)始,如果要編寫的類是現(xiàn)有某個(gè)類或者某幾個(gè)類的功能擴(kuò)展,則可以通過(guò)繼承已有類更快捷地實(shí)現(xiàn)新類。這就是類的繼承。
被繼承的稱之為父類(也叫基類),繼承自父親的稱之為子類(也叫派生類)。 Python的所有類都繼承自object。
繼承是面向?qū)ο蟪绦蛟O(shè)計(jì)的重要特征,也是實(shí)現(xiàn)“代碼復(fù)用”的重要手段。10.5類的繼承10.5.2繼承的設(shè)計(jì)
【范例10.15】e_animals.py【范例10.16】e_petsworld.py
【思考】程序中的三目運(yùn)算符如何改寫成常規(guī)的if語(yǔ)句?10.5類的繼承10.5.3語(yǔ)法分析
繼承的語(yǔ)法形式是
class子類名(父類名1,父類名2,…)。
繼承的注意事項(xiàng)如下:
(1)構(gòu)造類對(duì)象時(shí)將記住父類。如果在子類中找不到請(qǐng)求的成員時(shí),則將繼續(xù)查找父類。如果父類本身繼承自其他類,則遞歸應(yīng)用此規(guī)則。
(2)成員的重寫(overwrite)。子類可以重新定義父類中的方法。此時(shí),父類的同名原方法被隱藏??梢允褂胹uper()調(diào)用父類被隱藏的方法。
(3)Python允許多繼承,即允許子類同時(shí)繼承自多個(gè)父類。定義類時(shí),Python會(huì)為之創(chuàng)建一個(gè)MRO列表,用來(lái)管理類的繼承順序,Python通過(guò)這個(gè)列表從左到右查找繼承的信息。使用類名.__mro__或者類名.mro()可以獲得該信息?!痉独?0.17】e_ABC.py10.5類的繼承10.5.4方法的重寫
子類可以重寫父類的方法。如果子類的方法和父類的方法同名,則父類的同名方法被隱藏。如果要調(diào)用父類被隱藏的方法,則需要用到super(),其聲明如下。
classsuper([type[,object-or-type]]) super()返回一個(gè)代理對(duì)象,它會(huì)將方法調(diào)用委托給type的父類或兄弟類。這對(duì)于訪問(wèn)被隱藏的父類方法很有用。
單一繼承時(shí),super()不需要父類的名字就可以調(diào)用其成員方法。
多重繼承時(shí),__mro__屬性記錄了方法解析順序。該屬性是動(dòng)態(tài)的,可以在任何繼承層級(jí)結(jié)構(gòu)發(fā)生更新的時(shí)候被改變。MRO機(jī)制用來(lái)保證多類繼承的時(shí)候各父類被逐一調(diào)用并只被調(diào)用一次,搜索順序原則上是深度優(yōu)先、從左至右?!痉独?0.18】e_Family.py【范例10.19】e_BaseABC.py【思考】(1)為什么t.cry()輸出“cryinginC”而不是“cryinginB”?
(2)如果將classC(A,B)修改為classC(B,A),運(yùn)行效果是什么?為什么?10.5類的繼承10.5.5可變參數(shù)在繼承中的傳遞
可變參數(shù)可以非常方便地實(shí)現(xiàn)繼承中參數(shù)的傳遞?!痉独?0.20】e_three_generations.py10.5類的繼承10.5.6繼承中的權(quán)限處理
子類不能使用父類的private成員,但是可以使用父類的protected和public成員?!痉独?0.21】e_mems_error.py【范例10.22】e_mems_ok.py10.6進(jìn)一步探討10.6.1如何理解對(duì)象
對(duì)象是Python對(duì)數(shù)據(jù)的抽象。Python程序的所有數(shù)據(jù)都由對(duì)象或?qū)ο笾g的關(guān)系表示。每個(gè)對(duì)象都有一個(gè)身份id(即內(nèi)存地址)、一個(gè)類型和一個(gè)值。id(x)函數(shù)返回對(duì)象x的內(nèi)存地址?!痠s’運(yùn)算符比較兩個(gè)對(duì)象的地址,’==’比較兩個(gè)對(duì)象的值。10.6進(jìn)一步探討10.6.2對(duì)象的銷毀 Python中一切皆對(duì)象。類和實(shí)例都是以對(duì)象的方式來(lái)進(jìn)行管理的,都遵循Python的垃圾回收機(jī)制,也就是“引用計(jì)數(shù)”機(jī)制。
引用計(jì)數(shù)是每個(gè)Python對(duì)象的一個(gè)屬性,該屬性記錄著有多少變量正在引用(指向)該對(duì)象。將一個(gè)對(duì)象直接或者間接賦值給一個(gè)變量時(shí),對(duì)象的計(jì)數(shù)器會(huì)加1;當(dāng)變量被del刪除,或者
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 職業(yè)健康檔案電子化信息安全防護(hù)體系設(shè)計(jì)
- 貴州2025年貴州省實(shí)驗(yàn)中學(xué)招聘筆試歷年參考題庫(kù)附帶答案詳解
- 舟山浙江舟山市新城勾山幼兒園合同制教師招聘筆試歷年參考題庫(kù)附帶答案詳解
- 百色2025年廣西百色市德保縣鄉(xiāng)鎮(zhèn)事業(yè)單位招聘45人筆試歷年參考題庫(kù)附帶答案詳解
- 清遠(yuǎn)廣東清遠(yuǎn)市清新區(qū)太平鎮(zhèn)人民政府招聘森林消防中隊(duì)隊(duì)員20人筆試歷年參考題庫(kù)附帶答案詳解
- 泰州江蘇泰州興化市基層醫(yī)療衛(wèi)生單位招聘編外合同制護(hù)理人員82人筆試歷年參考題庫(kù)附帶答案詳解
- 新疆2025年新疆人民醫(yī)院科研助理崗位招聘筆試歷年參考題庫(kù)附帶答案詳解
- 徐州2025年江蘇徐州邳州市城區(qū)部分單位選調(diào)教師130人筆試歷年參考題庫(kù)附帶答案詳解
- 巴中2025年四川巴中恩陽(yáng)區(qū)選聘城區(qū)中小學(xué)教師25人筆試歷年參考題庫(kù)附帶答案詳解
- 安慶2025年安徽安慶市慈善總會(huì)招聘工作人員(勞務(wù)派遣制)筆試歷年參考題庫(kù)附帶答案詳解
- 2019-2020學(xué)年貴州省貴陽(yáng)市八年級(jí)下學(xué)期期末考試物理試卷及答案解析
- 培訓(xùn)機(jī)構(gòu)轉(zhuǎn)課協(xié)議
- 河道治理、拓寬工程 投標(biāo)方案(技術(shù)方案)
- 創(chuàng)客教室建設(shè)方案
- 政治審查表(模板)
- (完整版)南京市房屋租賃合同
- 《最奇妙的蛋》完整版
- SEMI S1-1107原版完整文檔
- 內(nèi)蒙古衛(wèi)生健康委員會(huì)綜合保障中心公開(kāi)招聘8人模擬預(yù)測(cè)(共1000題)筆試備考題庫(kù)及答案解析
- 2023年中級(jí)財(cái)務(wù)會(huì)計(jì)各章作業(yè)練習(xí)題
- 金屬罐三片罐成型方法與罐型
評(píng)論
0/150
提交評(píng)論