




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2025/10/101Python語(yǔ)言編程導(dǎo)論第九章面向?qū)ο缶幊虄?nèi)容提要概述類和對(duì)象屬性和方法繼承2025/10/102一、概述早期的編程語(yǔ)言沒(méi)有提供處理集群數(shù)據(jù)的良好接口。這意味著任何代碼段都可以存取某個(gè)數(shù)據(jù)結(jié)構(gòu)的任何部分,從而導(dǎo)致程序的缺陷難以隔離。如果將數(shù)據(jù)以及處理它們的過(guò)程組織為一個(gè)包并定義一個(gè)良好的接口,情況就會(huì)好很多。2025/10/1032025/10/104這種組織方法即現(xiàn)在廣為流行的面向?qū)ο缶幊谭椒ǎ∣OP)。面向?qū)ο缶幊淌且环N組織程序的新型思維方式,軟件設(shè)計(jì)的焦點(diǎn)不再是程序的邏輯流程,而是軟件或程序中的對(duì)象以及對(duì)象之間的關(guān)系。Python支持面向過(guò)程、面向?qū)ο?、函?shù)式編程等多種編程方式。Python不強(qiáng)制使用任何一種編程方式,可以使用面向過(guò)程方式編寫(xiě)任何程序,在編寫(xiě)小程序(少于500行代碼)時(shí),不會(huì)有問(wèn)題。但對(duì)于中等和大型項(xiàng)目來(lái)說(shuō),面向?qū)ο髸?huì)帶來(lái)很多優(yōu)勢(shì)。2025/10/105OOP提倡仔細(xì)設(shè)計(jì)和代碼重用。大多數(shù)現(xiàn)代編程語(yǔ)言都支持OOP,事實(shí)證明這是一種組織和創(chuàng)建大型程序的實(shí)用方式。Python對(duì)面向?qū)ο蟮恼Z(yǔ)法進(jìn)行了簡(jiǎn)化,去掉了面向?qū)ο笾性S多復(fù)雜的特性。例如,類的屬性和方法的限制符—public、private、protected。Python提倡語(yǔ)法的簡(jiǎn)單、易用性,這些訪問(wèn)權(quán)限靠程序員自覺(jué)遵守,而不強(qiáng)制使用。二、類和對(duì)象在面向?qū)ο蟪绦蛟O(shè)計(jì)中,程序員可以創(chuàng)建任何新的類型,這些類型可以描述每個(gè)對(duì)象包含的數(shù)據(jù)和特征,這種類型稱為類。類是一些對(duì)象的抽象,隱藏了對(duì)象內(nèi)部復(fù)雜的結(jié)構(gòu)和實(shí)現(xiàn)。類由變量和函數(shù)兩部分構(gòu)成,類中的變量稱為成員變量,類中的函數(shù)稱為成員函數(shù)。2025/10/1061、對(duì)象的概念Python支持許多不同類型的數(shù)據(jù)。例如:1234—int;3.14159—float;”Hello”—str[1,2,3,5,7,11,13]—list{“CA”:“California”,“MA”:“Massachusetts”}—dict以上每種類型都是對(duì)象。2025/10/107對(duì)象具有的特點(diǎn):類型(一個(gè)特定的對(duì)象被認(rèn)為是類型的實(shí)例)內(nèi)部數(shù)據(jù)表示(簡(jiǎn)單或復(fù)合)一組與對(duì)象交互的過(guò)程2025/10/108說(shuō)明:對(duì)象的內(nèi)部表示是私有的,用戶不應(yīng)當(dāng)依賴其實(shí)現(xiàn)的特定細(xì)節(jié)。如果直接操作對(duì)象的內(nèi)部表示,可能會(huì)損害對(duì)象的正確行為。例如:[1,2,3,4]Type:list內(nèi)部數(shù)據(jù)表示:一個(gè)大小為S(>=L)的對(duì)象數(shù)組,或一組獨(dú)立單元的鏈接表<data,pointertonextcell>操作列表的過(guò)程:l[i],l[i:j],l[i,j,k],+,*len(),min(),max(),dell[i]l.append(…),l.extend(…),l.count(…),l.index(…),l.insert(…),l.pop(…),l.remove(…),l.reverse(…),l.sort(…)2025/10/109Object-orientedprogramming(OOP)每個(gè)事物都是對(duì)象且有一個(gè)類型。對(duì)象是封裝的數(shù)據(jù)抽象:具有內(nèi)部表示具有與對(duì)象交互的接口定義行為,隱藏操作;屬性:數(shù)據(jù),方法(過(guò)程)用戶可以:創(chuàng)建新的對(duì)象實(shí)例刪除對(duì)象使用del或暫時(shí)忘掉它們Python將回收刪除了的或不再被存取的對(duì)象,被稱為“垃圾收集”。2025/10/10102、類和對(duì)象的區(qū)別類和對(duì)象是OOP中兩個(gè)重要概念。類是對(duì)客觀世界中事物的抽象,而對(duì)象是類實(shí)例化后的實(shí)體。類型和變量之間存在著一定的聯(lián)系,類型是模板,而變量則是具有這種模板的一個(gè)實(shí)體。同樣,有了“類”類型就有其對(duì)應(yīng)的變量實(shí)體,這就是對(duì)象。表面上看對(duì)象是某個(gè)“類”類型的變量,但對(duì)象又不是普通的變量,對(duì)象是一個(gè)數(shù)據(jù)和操作的封裝體。封裝的目的就是阻止非法的訪問(wèn),因此對(duì)象實(shí)現(xiàn)了信息的隱藏,外部只能通過(guò)操作接口訪問(wèn)對(duì)象數(shù)據(jù)。對(duì)象是屬于某個(gè)已知的類的,因此必須先定義類,然后才能定義對(duì)象。2025/10/10112025/10/1012從本質(zhì)上說(shuō),對(duì)象是一組數(shù)據(jù)以及操作這些數(shù)據(jù)的函數(shù)。之前介紹的數(shù)字、字符串、列表、字典和函數(shù)都是Python提供的內(nèi)置對(duì)象。要?jiǎng)?chuàng)建新型對(duì)象,必須先創(chuàng)建類。類就類似于內(nèi)置數(shù)據(jù)類型,可用于創(chuàng)建特定類型的對(duì)象。類指定了對(duì)象將包含哪些數(shù)據(jù)和函數(shù),還指定了對(duì)象與其他類的關(guān)系。對(duì)象封裝了數(shù)據(jù)以及操作這些數(shù)據(jù)的函數(shù)。一個(gè)重要的OOP功能是繼承:創(chuàng)建新類時(shí),可讓其繼承父類的數(shù)據(jù)和函數(shù)。使用好繼承可避免重新編寫(xiě)代碼,還可讓程序更容易理解。例如:自行車類數(shù)據(jù)抽象—型號(hào),品牌,換檔數(shù)代碼抽象—Break(),SpeedUp(),ChangShift(),Run(),Stop()2025/10/10133、類的定義Python使用class關(guān)鍵字定義一個(gè)類,類名首字符一般要大寫(xiě)。當(dāng)需要?jiǎng)?chuàng)建的類型不能用簡(jiǎn)單類型來(lái)表示時(shí),則需要定義類,然后利用定義的類創(chuàng)建對(duì)象。格式:classClass_name:…2025/10/1014例9-1:創(chuàng)建一個(gè)Person類2025/10/1015說(shuō)明:self是指向?qū)ο蟊旧淼淖兞浚愃婆cC++的this指針說(shuō)明:當(dāng)定義一個(gè)類時(shí),如果這個(gè)類沒(méi)有任何父類,則將object設(shè)置為它的父類,用這種方式定義的類屬于新式類。如果定義的類沒(méi)有設(shè)置任何父類,則這種方式定義的類屬于經(jīng)典類。建議使用新式類,新式類將類與內(nèi)建類型進(jìn)行了統(tǒng)一。新式類與經(jīng)典類在多重繼承問(wèn)題中有一個(gè)重要的區(qū)別:對(duì)于經(jīng)典類,繼承順序是采用深度優(yōu)先的搜索算法,對(duì)于新式類,繼承順序是采用廣度優(yōu)先的搜索算法。2025/10/10164、對(duì)象的創(chuàng)建創(chuàng)建對(duì)象的過(guò)程稱為實(shí)例化。當(dāng)一個(gè)對(duì)象被創(chuàng)建之后,包含3方面的特性:對(duì)象的標(biāo)識(shí)、屬性和方法。對(duì)象的標(biāo)識(shí)用于區(qū)分不同的對(duì)象,當(dāng)對(duì)象被創(chuàng)建之后,該對(duì)象會(huì)獲取一塊存儲(chǔ)空間,存儲(chǔ)空間的地址即為對(duì)象的標(biāo)識(shí)。對(duì)象的屬性和方法與類的成員變量和成員函數(shù)相對(duì)應(yīng)。2025/10/1017例9-2:對(duì)象的創(chuàng)建和應(yīng)用2025/10/1018執(zhí)行結(jié)果:self示意圖:2025/10/1019Python自動(dòng)給每個(gè)對(duì)象添加特殊變量self,該變量指向?qū)ο蟊旧?,讓類中的函?shù)能夠明確地引用對(duì)象的數(shù)據(jù)和函數(shù)。5、對(duì)象的顯示在例9-2中,定義了一個(gè)方法display,用于顯示對(duì)象的值。Python還提供了一些特殊方法,讓我們能夠定制對(duì)象的打印。如:特殊方法__str__,用于生成對(duì)象的字符串表示;特殊方法__repr__,返回對(duì)象的“官方”表示。在大多數(shù)類中,方法__repr__都與__str__相同。2025/10/1020例9-3:對(duì)象的顯示2025/10/1021執(zhí)行結(jié)果:課堂練習(xí)一:課堂練習(xí)一2025/10/1022三、屬性和方法類是由屬性和方法組成。類的屬性是對(duì)數(shù)據(jù)的封裝,而類的方法則表示對(duì)象具有的行為。類通常由函數(shù)(實(shí)例方法)和變量(類變量)組成。Python的構(gòu)造函數(shù)、析構(gòu)函數(shù)、私有屬性或方法都是通過(guò)名稱約定區(qū)分的。此外,Python還提供了一些有用的內(nèi)置方法,簡(jiǎn)化了類的實(shí)現(xiàn)。2025/10/10231、類的屬性Python的類的屬性一般分為私有屬性和公有屬性,像C++有定義屬性的關(guān)鍵字(public、private、protect),而Python沒(méi)有這類關(guān)鍵字,默認(rèn)情況下所有的屬性都是“公有的”,對(duì)公有屬性的訪問(wèn)沒(méi)有任何限制,且都會(huì)被子類繼承,也能從子類中進(jìn)行訪問(wèn)。若不希望類中的屬性在類外被直接訪問(wèn),就要定義為私有屬性。Python使用約定屬性名稱來(lái)劃分屬性類型。若屬性的名字以兩個(gè)下劃線開(kāi)始,表示私有屬性;反之,沒(méi)有使用雙下劃線開(kāi)始的表示公有屬性。類的方法也同樣使用這樣的約定。另外,Python沒(méi)有保護(hù)類型的修飾符。2025/10/1024Python的實(shí)例屬性和靜態(tài)屬性:實(shí)例屬性是以self為前綴的屬性,沒(méi)有該前綴的屬性是普通的局部變量。C++中有一類特殊的屬性稱為靜態(tài)變量。靜態(tài)變量可以被類直接調(diào)用,而不被實(shí)例化對(duì)象調(diào)用。當(dāng)創(chuàng)建新的實(shí)例化對(duì)象后,靜態(tài)變量并不會(huì)獲取新的內(nèi)存空間,而是使用類創(chuàng)建的內(nèi)存空間。因此,靜態(tài)變量能夠被多個(gè)實(shí)例化對(duì)象共享。在Python中靜態(tài)變量稱為類變量,類變量可以在該類的所有實(shí)例中被共享。2025/10/1025例9-4:實(shí)例變量和類變量2025/10/1026執(zhí)行結(jié)果:關(guān)于Python私有屬性的訪問(wèn):類的外部不能直接訪問(wèn)私有屬性。Python提供了直接訪問(wèn)私有屬性的方式,可用于程序的測(cè)試和調(diào)試。私有屬性訪問(wèn)的格式:instance._classname__attribute說(shuō)明:instance表示實(shí)例化對(duì)象;classname表示類名;attibute表示私有屬性注意:classname之前是單下劃線,attibute之前是雙下劃線2025/10/1027例9-5:訪問(wèn)私有屬性2025/10/1028執(zhí)行結(jié)果:注意:Python對(duì)類的屬性和方法的定義次序并沒(méi)有要求。合理的方式是將類屬性定義在類中最前面,然后再定義私有方法,最后定義公有方法。Python的類還提供了一些內(nèi)置屬性,用于管理類的內(nèi)部關(guān)系。例如:__dict__,__bases__,__doc__等。2025/10/1029例9-6:常見(jiàn)的類內(nèi)置屬性用法2025/10/1030執(zhí)行結(jié)果:2、類的方法類的方法也分為公有方法和私有方法。私有方法不能被模塊外的類或方法調(diào)用,私有方法也不能被外部的類或函數(shù)調(diào)用。C++中的靜態(tài)方法使用關(guān)鍵字static聲明,而Python使用函數(shù)staticmethod()或@staticmethod修飾器將普通的函數(shù)轉(zhuǎn)換為靜態(tài)方法。Python的靜態(tài)方法并沒(méi)有和類的實(shí)例進(jìn)行名稱綁定,要調(diào)用除了使用通常的方法,使用類名作為其前綴亦可。2025/10/1031例9-7:類的方法及靜態(tài)方法的使用2025/10/1032執(zhí)行結(jié)果:3、__init__方法構(gòu)造函數(shù)用于初始化類的內(nèi)部狀態(tài),為類的屬性設(shè)置默認(rèn)值。C++的構(gòu)造函數(shù)是與類同名的方法,而Python的構(gòu)造函數(shù)名為_(kāi)_init__。__init__方法除了用于定義實(shí)例變量外,還用于程序的初始化。__init__方法是可選的,若不提供__init__方法,Python將會(huì)給出1個(gè)默認(rèn)的__init__方法。2025/10/1033例9-8:構(gòu)造函數(shù)應(yīng)用一2025/10/1034執(zhí)行結(jié)果:例9-9:構(gòu)造函數(shù)應(yīng)用二上例中,若給出的值不合理也無(wú)法限制。通常的做法是在類中定義設(shè)置函數(shù)和獲取函數(shù)。2025/10/1035執(zhí)行結(jié)果:4、__del__方法析構(gòu)函數(shù)用于釋放對(duì)象占用的資源。Python提供了析構(gòu)函數(shù)__del__()。析構(gòu)函數(shù)也是可選的。若程序中不提供析構(gòu)函數(shù),Python會(huì)提供默認(rèn)的析構(gòu)函數(shù)。當(dāng)對(duì)象不再被使用時(shí),__del__方法運(yùn)行,但是很難保證這個(gè)方法究竟什么時(shí)候運(yùn)行,若想指明它的運(yùn)行,就要顯式地調(diào)用析構(gòu)函數(shù):del對(duì)象名由于Python中定義了__del__()的實(shí)例將無(wú)法被Python的循環(huán)垃圾收集器(gc)收集,所以建議只有需要時(shí)才定義__del__。事實(shí)上,使用Python編寫(xiě)程序可以不考慮后臺(tái)的內(nèi)存管理,直接面對(duì)程序的邏輯。2025/10/1036例9-10:析構(gòu)函數(shù)應(yīng)用2025/10/1037執(zhí)行結(jié)果:5、垃圾回收機(jī)制Python使用垃圾回收機(jī)制來(lái)清理不再使用的對(duì)象。Python提供gc模塊釋放不再使用的對(duì)象,Python采用“引用計(jì)數(shù)”的算法來(lái)處理回收,即:當(dāng)某個(gè)對(duì)象在其作用域內(nèi)不再被其他對(duì)象引用時(shí),Python就自動(dòng)清除該對(duì)象。Python的函數(shù)collect()可以一次性收集所有待處理的對(duì)象(gc.collect())2025/10/1038例9-11:使用gc模塊顯式地調(diào)用垃圾回收器2025/10/10392025/10/1040執(zhí)行結(jié)果(與shop對(duì)象關(guān)聯(lián)的所有對(duì)象):2025/10/10416、類的內(nèi)置方法內(nèi)置方法描述__init__(self,…)初始化對(duì)象,在創(chuàng)建對(duì)象時(shí)調(diào)用__del__(self)釋放對(duì)象,在對(duì)象被刪除時(shí)調(diào)用__str__(self)生成對(duì)象的字符串表示,在使用print語(yǔ)句時(shí)被調(diào)用__repr__(self)生成對(duì)象的官方表示,在使用print語(yǔ)句時(shí)被調(diào)用__getitem__(self,key)獲取序列的所有key對(duì)應(yīng)的值,等價(jià)于seq[key]__len__(self)在調(diào)用內(nèi)聯(lián)函數(shù)len()時(shí)被調(diào)用2025/10/1042Python類定義了一些專用的方法,這些專用方法豐富了程序設(shè)計(jì)的功能,用于不同的應(yīng)用場(chǎng)合。之前介紹的__init__、__del__都是類的內(nèi)置方法。表9-1列出了類常用的內(nèi)置方法。表9-1類常用的內(nèi)置方法2025/10/1043內(nèi)置方法描述__cmp__(src,dst)比較兩個(gè)對(duì)象src和dst__getattr__(self,name)獲取屬性的值__getattribute__(self,name)獲取屬性的值,能更好地控制__setattr__(self,name,val)設(shè)置屬性的值__delattr__(self,name)刪除name屬性__call__(self,*args)將實(shí)例對(duì)象作為函數(shù)調(diào)用__gt__(self,other)判斷self對(duì)象是否大于other對(duì)象__lt__(self,other)判斷self對(duì)象是否小于other對(duì)象__ge__(self,other)判斷self對(duì)象是否大于或等于other對(duì)象__le__(self,other)判斷self對(duì)象是否小于或等于other對(duì)象__eq__(self,other)判斷self對(duì)象是否等于other對(duì)象(1)__getatrr__()、__setattr__()和__getattribute__()當(dāng)讀取對(duì)象的某個(gè)屬性時(shí),Python會(huì)自動(dòng)調(diào)用__getattr__()方法。例如,fruit.color將轉(zhuǎn)換為fruit.__getattr__(color)。當(dāng)使用賦值表達(dá)式對(duì)屬性進(jìn)行設(shè)置時(shí),Python會(huì)自動(dòng)調(diào)用__setattr__()方法。__getattribute__()的功能與__getattr__()類似,用于獲取屬性的值,但__getattribute__()能提供更好的控制,使代碼更健壯。2025/10/1044例9-12:獲取和設(shè)置對(duì)象的屬性2025/10/1045說(shuō)明:去掉上述代碼中__getattribute__()、__setattr__()的實(shí)現(xiàn)代碼并不會(huì)影響輸出結(jié)果,但這些方法可以實(shí)現(xiàn)對(duì)屬性的控制,根據(jù)屬性名做不同的處理。執(zhí)行結(jié)果:(2)__getitem__()如果類中將某個(gè)屬性定義為序列,可以使用__getitem__()輸出序列屬性中的各個(gè)元素。例9-13:獲取對(duì)象的屬性為序列中的各個(gè)元素2025/10/1046執(zhí)行結(jié)果:(3)__str__()__str__()用于生成對(duì)象的字符串表示。實(shí)現(xiàn)了該方法后,可以直接使用print語(yǔ)句輸出對(duì)象,也可以通過(guò)函數(shù)str()觸發(fā)其執(zhí)行。例9-3就使用了__str__()方法。2025/10/10477、方法的動(dòng)態(tài)特性Python作為動(dòng)態(tài)腳本語(yǔ)言,編寫(xiě)的程序具有很強(qiáng)的動(dòng)態(tài)性??梢詣?dòng)態(tài)添加類的方法,將某個(gè)已經(jīng)定義的函數(shù)添加到類中。添加新方法的語(yǔ)法格式為:class_name.method_name=function_name其中,class_name表示類名,method_name表示新的方法名,function_name表示1個(gè)已經(jīng)存在的函數(shù)。還可以對(duì)已經(jīng)定義的方法進(jìn)行修改。修改方法的語(yǔ)法格式為:class_name.method_name=function_name其中,class_name表示類名,method_name表示已經(jīng)存在的方法名,function_name表示1個(gè)已經(jīng)存在的函數(shù),該賦值表達(dá)式表示將函數(shù)的內(nèi)容更新到方法。2025/10/1048例9-14:向類中動(dòng)態(tài)地添加新方法2025/10/1049執(zhí)行結(jié)果:例9-15:動(dòng)態(tài)修改類中已有的方法2025/10/1050執(zhí)行結(jié)果:例9-16:創(chuàng)建一個(gè)表示整數(shù)集合的新類創(chuàng)建一個(gè)新類表示整數(shù)集合初始時(shí)集合為空每個(gè)特定的整數(shù)只能在集合中出現(xiàn)一次(注:必須在方法中強(qiáng)制實(shí)現(xiàn))內(nèi)部數(shù)據(jù)表示用一個(gè)列表存儲(chǔ)集合中的元素接口insert(e):若整數(shù)e不存在,則插入e到集合中member(e):若整數(shù)e在集合中返回True,否則返回Falseremove(e):從集合中刪除整數(shù)e,若不存在則出錯(cuò)2025/10/1051程序?qū)崿F(xiàn):2025/10/10522025/10/1053執(zhí)行:2025/10/1054例9-17:創(chuàng)建一個(gè)關(guān)于人的信息的類及相關(guān)方法Person:name,birthdayGetlastnameSortbylastnameGetage2025/10/10552025/10/1056執(zhí)行:2025/10/1057課堂練習(xí)二:課堂練習(xí)二2025/10/1058四、繼承繼承是面向?qū)ο蟮闹匾匦灾?,可?shí)現(xiàn)代碼的重用。通過(guò)繼承可以創(chuàng)建新類,給既有類的副本添加變量和方法。原始的類稱為父類或超類,新類稱為子類或派生類。繼承可以重用已經(jīng)存在的數(shù)據(jù)和行為,減少代碼的重復(fù)編寫(xiě)。Python在類名后使用一對(duì)括號(hào)表示繼承關(guān)系,括號(hào)中即為父類。2025/10/1059關(guān)于在單繼承關(guān)系中的構(gòu)造函數(shù):python中如果子類有自己的構(gòu)造函數(shù),不會(huì)自動(dòng)調(diào)用父類的構(gòu)造函數(shù),如果需要用到父類的構(gòu)造函數(shù),則需要在子類的構(gòu)造函數(shù)中顯式地調(diào)用。如果子類需要擴(kuò)展父類的行為,可以添加__init__方法的參數(shù)。如果子類沒(méi)有自己的構(gòu)造函數(shù),則會(huì)直接從父類繼承構(gòu)造函數(shù)。2025/10/10601、使用繼承當(dāng)類設(shè)計(jì)完成之后,就可以考慮類之間的邏輯關(guān)系。類之間存在繼承、組合、依賴等關(guān)系,可以采用UML工具表示類之間的關(guān)系。例如,有兩個(gè)子類Apple、Banana繼承自父類Fruit,父類中有1個(gè)公有實(shí)例變量和1個(gè)公有的方法。圖9-1表示了Fruit類和Apple、Banana類之間的繼承關(guān)系(公有實(shí)例變量和方法假定用“+”表示)。Apple、Banana類可以繼承Fruit類的實(shí)例變量color和方法grow()。2025/10/1061圖9-1:類的繼承關(guān)系2025/10/1062例9-18:類的繼承2025/10/10632025/10/1064執(zhí)行結(jié)果:例9-19:在例9-17一般人的基礎(chǔ)上增加MIT人員的內(nèi)容Person:name,birthdayGetlastnameSortbylastnameGetageMITPerson:Person+IDNumberAssignIDnumbersinsequenceGetIDnumberSortbyIDnumber2025/10/1065定義MIT人員的類:2025/10/1066執(zhí)行:2025/10/1067說(shuō)明:為什么P4<P1能夠執(zhí)行,而P1<P4不行?P4<P1相當(dāng)于調(diào)用P4.__it__(P1),相當(dāng)于使用與P4對(duì)象相關(guān)的Person的方法,根據(jù)人的姓名做比較,因此可正常執(zhí)行;P1<P4相當(dāng)于調(diào)用P1.__it__(P4),相當(dāng)于使用與P1對(duì)象相關(guān)的MITPeron的方法,根據(jù)人的IDNum做比較,而P4是一個(gè)Person,沒(méi)有IDNum,因此無(wú)法比較。2025/10/1068例9-20:在例9-19的MITPerson基礎(chǔ)上,再派生出學(xué)生和研究生(多層派生)Person:name,birthdayGetlastnameSortbylastnameGetageMITPerson:Person+IDNumberAssignIDnumbersinsequenceGetIDnumberSortbyIDnumberStudents:severaltypes,allMITPersonUndergraduate
student:hasclassyearGraduatestudent2025/10/1069創(chuàng)建一個(gè)覆蓋所有學(xué)生的超類較好:2025/10/1070定義Student類及其子類:2025/10/1071執(zhí)行:2、抽象基類使用繼承之后,子類可以重用父類中的屬性和方法,且可以對(duì)繼承的方法進(jìn)行重寫(xiě)。例如:例9-18中的Apple、Banana都繼承了Fruit類,Apple、Banana類都具有父類的grow()方法。Fruit類是對(duì)水果的抽象,不同的水果有不同的培育方法,因此生長(zhǎng)的情況也不相同。Fruit類的grow()是對(duì)所有水果行為的抽象,并不知道如何生長(zhǎng),因此,grow()方法應(yīng)該是一個(gè)空方法,即抽象方法。抽象基類是對(duì)一類事物的特征行為的抽象,由抽象方法組成。在Python3中可以使用abc模塊,該模塊中有一個(gè)元類ABCmeta和修飾器@abstractmethod。抽象基類不能被直接實(shí)例化。2025/10/1072例9-21:抽象基類應(yīng)用2025/10/1073執(zhí)行結(jié)果:3、多態(tài)性繼承機(jī)制說(shuō)明子類具有父類的公有屬性和方法,而且子類可以擴(kuò)展自身的功能,添加新的屬性和方法。因此,子類可以替代父類對(duì)象,這種特性稱為多態(tài)性。此外,從根本上說(shuō),所謂多態(tài)性是指當(dāng)不同的對(duì)象收到相同的消息時(shí),產(chǎn)生不同的動(dòng)作。2025/10/1074例9-22:多態(tài)性應(yīng)用2025/10/1075例如,Apple、Banana類繼承了Fruit類,因此Apple、Banana具有Fruit類的共性。Apple、Banana類的實(shí)例可以替代Fruit對(duì)象,同時(shí)又呈現(xiàn)出各自的特性。2025/10/1076執(zhí)行結(jié)果:例9-23:多態(tài)性應(yīng)用(一個(gè)簡(jiǎn)單游戲)創(chuàng)建一個(gè)名為Undercut的簡(jiǎn)單游戲。在這個(gè)游戲中,兩個(gè)玩家同時(shí)選擇1-10的整數(shù),若一個(gè)玩家選擇的整數(shù)比對(duì)方選擇的整數(shù)小1,則該玩家獲勝,否則算打平手。例如,若Thomas和Bonnie一起玩游戲Undercut,且他們選擇的數(shù)字分別為9和10,則Thomas獲勝;如果他們分別選擇4和7,則打成平手。2025/10/1077基類定義:2025/10/1078玩Undercut游戲的函數(shù)為:2025/10/1079實(shí)現(xiàn)get_move函數(shù):雖然在游戲Undercut中,走法不過(guò)是選擇1—10的數(shù)字,但人和計(jì)算機(jī)選擇數(shù)字的方式不同。人類玩家通過(guò)鍵盤(pán)輸入一個(gè)1—10的數(shù)字,而計(jì)算機(jī)玩家使用函數(shù)來(lái)選擇數(shù)字。因此,Hu
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年生物中考模擬試卷及答案
- 2025年固原消防培訓(xùn)題庫(kù)及答案
- 2025年初會(huì)新增內(nèi)容題庫(kù)及答案
- 2025年單招語(yǔ)文考試試題及答案
- 2025年財(cái)務(wù)知識(shí)基礎(chǔ)題庫(kù)及答案
- 化學(xué)史重要事件與人物匹配試題
- 化學(xué)創(chuàng)業(yè)素質(zhì)初步評(píng)估試題
- 2025年南開(kāi)開(kāi)學(xué)考試試題及答案
- 績(jī)溪教師招聘真題及答案
- 2025年上半年四川省教育化與大數(shù)據(jù)中心(四川省電化教育館)招聘編外工作人員3人考前自測(cè)高頻考點(diǎn)模擬試題及完整答案詳解1套
- T-SUCCA 01-2024 營(yíng)運(yùn)車輛停運(yùn)損失鑒定評(píng)估規(guī)范
- 網(wǎng)絡(luò)安全知識(shí)課件模板
- 礦井避震知識(shí)培訓(xùn)課件
- 呼衰患者的腸內(nèi)營(yíng)養(yǎng)
- 《抗生素的臨床應(yīng)用》課件
- 養(yǎng)老院護(hù)理員的崗前培訓(xùn)
- 微生物檢驗(yàn)技能-細(xì)菌的生化試驗(yàn)
- 2025年1月上海市春季高考模擬英語(yǔ)試卷(含答案解析)
- 中國(guó)慢性阻塞性肺疾病基層診療指南(2024年)解讀
- 2024年代還款三方協(xié)議書(shū)模板范本
- 外研版(2024)七年級(jí)上冊(cè) Unit 2 More than fun練習(xí)(含答案)
評(píng)論
0/150
提交評(píng)論