版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第6章面向?qū)ο缶幊袒A(chǔ)類(lèi)和對(duì)象類(lèi)的定義和實(shí)例化實(shí)例與類(lèi)的對(duì)象屬性成員屬性與成員方法類(lèi)的繼承與多態(tài)類(lèi)和對(duì)象類(lèi)的定義和實(shí)例化實(shí)例與類(lèi)的對(duì)象屬性成員屬性與成員方法類(lèi)的繼承與多態(tài)了解面向?qū)ο蠡靖拍钫莆疹?lèi)和對(duì)象的關(guān)系掌握類(lèi)的屬性和方法掌握類(lèi)方法和靜態(tài)方法的定義與使用掌握類(lèi)的繼承、多態(tài)類(lèi)和對(duì)象
6.16.1類(lèi)和對(duì)象面向?qū)ο竺嫦驅(qū)ο缶幊?ObjectOrientedProgramming,OOP)是一種程序設(shè)計(jì)思想。我們經(jīng)常聽(tīng)說(shuō)的面向?qū)ο缶幊叹褪侵饕槍?duì)大型軟件設(shè)計(jì)而提出的,它可以使軟件設(shè)計(jì)更加靈活,并且能更好地進(jìn)行代碼復(fù)用,這些優(yōu)勢(shì)主要來(lái)自于面向?qū)ο蟪绦蛟O(shè)計(jì)的三個(gè)基本特性:封裝性、繼承性、多態(tài)性。Python從設(shè)計(jì)之初就已經(jīng)是一門(mén)面向?qū)ο蟮恼Z(yǔ)言。它可以很方便地創(chuàng)建類(lèi)和對(duì)象。6.1類(lèi)和對(duì)象1.什么是類(lèi)類(lèi)是用來(lái)描述具有相同的屬性和方法的對(duì)象的集合。它定義了該集合中每個(gè)對(duì)象所共有的屬性和方法。對(duì)象是類(lèi)的實(shí)例。在Python語(yǔ)言中,使用class關(guān)鍵字定義類(lèi),關(guān)鍵字之后有一個(gè)空格,然后類(lèi)的名稱(chēng),最后一個(gè)冒號(hào),換行定義類(lèi)的內(nèi)部實(shí)現(xiàn)。6.1類(lèi)和對(duì)象2.什么是對(duì)象對(duì)象是某個(gè)具體的實(shí)物,也可以說(shuō)萬(wàn)物皆對(duì)象,對(duì)象擁有自己的特征和行為。如:你手中的手機(jī),你身邊的某臺(tái)電腦,你用的水杯等。從概念層面講,就是某種事物的抽象(功能)。抽象原則包括數(shù)據(jù)抽象和過(guò)程抽象兩個(gè)方面:數(shù)據(jù)抽象就是定義對(duì)象的屬性,過(guò)程抽象就是定義對(duì)象的操作。6.1類(lèi)和對(duì)象3.類(lèi)和對(duì)象的關(guān)系類(lèi)是對(duì)象的類(lèi)型,對(duì)象是類(lèi)的實(shí)例。二者相輔相成,誰(shuí)也離不開(kāi)誰(shuí)。類(lèi)與對(duì)象的關(guān)系:用類(lèi)去創(chuàng)建(實(shí)例化)一個(gè)對(duì)象。開(kāi)發(fā)中,先有類(lèi),才有對(duì)象。類(lèi)類(lèi)是對(duì)多個(gè)對(duì)象共同特征的抽象描述,它是對(duì)象的模板。對(duì)象對(duì)象用于描述現(xiàn)實(shí)中的個(gè)體,它是類(lèi)的實(shí)例。類(lèi)的定義和實(shí)例化
類(lèi)的定義類(lèi)的實(shí)例化6.26.2.1類(lèi)的定義類(lèi)是一個(gè)數(shù)據(jù)結(jié)構(gòu),類(lèi)定義數(shù)據(jù)類(lèi)型的數(shù)據(jù)(屬性)和行為(方法)。對(duì)象是類(lèi)的具體實(shí)體,也可以稱(chēng)為類(lèi)的實(shí)例(instance)。在Python語(yǔ)言中,類(lèi)稱(chēng)為類(lèi)對(duì)象(classobject);類(lèi)的實(shí)例稱(chēng)為實(shí)例對(duì)象(instanceobject),如Student類(lèi),而實(shí)例是根據(jù)類(lèi)創(chuàng)建出來(lái)的一個(gè)具體的“對(duì)象”,每個(gè)對(duì)象都擁有相同的方法,但各自的數(shù)據(jù)可能不同。6.2.1類(lèi)的定義在Python中,通過(guò)class關(guān)鍵字定義類(lèi),在使用類(lèi)時(shí)一般需要先實(shí)例化,然后才能調(diào)用實(shí)例化后的類(lèi)的方法和屬性等。定義類(lèi)的語(yǔ)法格式:classClassName:
類(lèi)的實(shí)體類(lèi)名通常是以大寫(xiě)開(kāi)頭的單詞。名為有效的標(biāo)識(shí)符,命名規(guī)則一般為多個(gè)單詞組成的名稱(chēng),每個(gè)單詞除第一個(gè)字母大寫(xiě)外,其余的字母均小寫(xiě)類(lèi)體由縮進(jìn)的語(yǔ)句塊組成。定義類(lèi)時(shí),用變量形式表示的對(duì)象屬性稱(chēng)為數(shù)據(jù)成員或者屬性(成員變量),用函數(shù)形式表示的對(duì)象行為稱(chēng)為成員函數(shù)(成員方法)。成員屬性和成員方法統(tǒng)稱(chēng)為類(lèi)的成員。例【6-1】類(lèi)的定義示例。classStudent:name="木子"defstudy(self):print("哈哈,我正在學(xué)習(xí)中")6.2.2類(lèi)的實(shí)例化類(lèi)是抽象的,如果要使用類(lèi)定義的功能,就必須實(shí)例化類(lèi),即創(chuàng)建類(lèi)的對(duì)象。在創(chuàng)建實(shí)例對(duì)象后,可以使用“.”運(yùn)算符來(lái)調(diào)用其成員創(chuàng)建類(lèi)的對(duì)象、創(chuàng)建類(lèi)的實(shí)例、實(shí)例化類(lèi)等說(shuō)法是等價(jià)的,都說(shuō)明以類(lèi)為模板生成了一個(gè)對(duì)象的操作。比如:定義好了Student類(lèi),定義完類(lèi)后,并不會(huì)真正創(chuàng)建一個(gè)實(shí)例。語(yǔ)法格式:obj=Student()定義了具體的對(duì)象后,并通過(guò)“對(duì)象名.成員”形式訪問(wèn)其中的數(shù)據(jù)成員或者成員方法。6.2.2類(lèi)的實(shí)例化例【6-2】類(lèi)的創(chuàng)建與實(shí)例化。#class聲明一個(gè)類(lèi)classStudent:name='木子'#self是class內(nèi)創(chuàng)建函數(shù)自帶第一個(gè)位置的參數(shù),命名可自定義
deffuncA(self):print("正在學(xué)習(xí)中")x=Student #實(shí)例化對(duì)象print()#輸出對(duì)象的屬性x.funcA(‘’) #調(diào)用對(duì)象的方法運(yùn)行結(jié)果:木子正在學(xué)習(xí)中實(shí)例與類(lèi)的對(duì)象屬性實(shí)例對(duì)象屬性類(lèi)對(duì)象屬性實(shí)例對(duì)象屬性與類(lèi)對(duì)象屬性區(qū)別與聯(lián)系6.36.3.1實(shí)例對(duì)象屬性類(lèi)的數(shù)據(jù)成員是在類(lèi)中定義的成員變量(域),用來(lái)存儲(chǔ)描述類(lèi)的特征的值,稱(chēng)承之為屬性。比如:人的姓名、年齡、身高、體重…都是對(duì)象的屬性。屬性可以被該類(lèi)中定義的方法訪問(wèn),也可以通過(guò)類(lèi)對(duì)象或?qū)嵗龑?duì)象進(jìn)行訪問(wèn)。在在函數(shù)體或代碼塊中定義的局部變量只能在其定義的范圍內(nèi)進(jìn)行訪問(wèn)。屬性實(shí)際上是在類(lèi)中的變量。Python變量不需要聲明,可直接使用。建議在類(lèi)定義的開(kāi)始位置初始化類(lèi)屬性,或者在構(gòu)造函數(shù)(__init__())中初始化實(shí)例屬性。6.3.1實(shí)例對(duì)象屬性實(shí)例對(duì)象屬性,也稱(chēng)為實(shí)例對(duì)象變量,是指通過(guò)“self.變量名”定義的屬性。類(lèi)的每個(gè)實(shí)例都包含了該類(lèi)的實(shí)例對(duì)象變量的一個(gè)單獨(dú)副本,實(shí)例對(duì)象變量屬于特定的實(shí)例。實(shí)例對(duì)象變量在類(lèi)的內(nèi)部通過(guò)self訪問(wèn),在外部通過(guò)對(duì)象實(shí)例訪問(wèn)。實(shí)例對(duì)象屬性一般在__init__()方法中通過(guò)如下形式初始化:self.實(shí)例變量名=初始值在其他實(shí)例函數(shù)中,通過(guò)self訪問(wèn):self.實(shí)例變量名=值#寫(xiě)入self.實(shí)例變量名self.實(shí)例變量名
#讀取創(chuàng)建對(duì)象實(shí)例后,通過(guò)對(duì)象實(shí)例訪問(wèn):obj=類(lèi)名() #創(chuàng)建對(duì)象實(shí)例obj.實(shí)例變量名=值#寫(xiě)入obj.實(shí)例變量名
#讀取or初始化訪問(wèn)6.3.1實(shí)例對(duì)象屬性例【6-3】實(shí)例對(duì)象屬性應(yīng)用示例。classStudent: #定義類(lèi)Studentdef__init__(self,name,age):#__init__方法
=name #初始化,即成員變量nameself.age=age#初始化self.age,即成員變量agedefsay_hello(self):#定義類(lèi)Student的函數(shù)say_hi()print('您好,我叫',)#在實(shí)例方法中通過(guò)讀取成員變量nameobj=Student('木子',18)#創(chuàng)建對(duì)象obj.say_hello()#調(diào)用對(duì)象的方法print(obj.age)#通過(guò)obj.age讀取成員變量age運(yùn)行結(jié)果:您好,我叫木子186.3.2類(lèi)對(duì)象屬性Python也允許聲明屬于類(lèi)對(duì)象本身的變量,即類(lèi)對(duì)象屬性,也稱(chēng)為類(lèi)屬性、類(lèi)變量、類(lèi)對(duì)象變量、靜態(tài)屬性。類(lèi)屬性屬于整個(gè)類(lèi),不是特定實(shí)例的一部分,而多而是所有實(shí)例之間共享一個(gè)副本。對(duì)象屬性一般在類(lèi)體中通過(guò)如下形式初始化:類(lèi)變量名=初始值在其類(lèi)定義的方法中或外部代碼中,通過(guò)類(lèi)名訪問(wèn):類(lèi)名.類(lèi)變量名=值#寫(xiě)入類(lèi)名.類(lèi)變量名#讀取6.3.2類(lèi)對(duì)象屬性例【6-4】類(lèi)對(duì)象屬性的應(yīng)用。classStudent:count=0#定義屬性count,表示計(jì)數(shù)
name="初心"#定義屬性name,表示名稱(chēng)
Student.count+=1#通過(guò)類(lèi)名訪問(wèn),將計(jì)數(shù)加1print(Student.count)#類(lèi)名訪問(wèn),讀取并顯示類(lèi)屬性print(S)#類(lèi)名訪問(wèn),讀取并顯示類(lèi)屬性obj1=Student()#創(chuàng)建實(shí)例對(duì)象1obj2=Student()#創(chuàng)建實(shí)例對(duì)象2print((,))#通過(guò)實(shí)例對(duì)象訪問(wèn),讀取成員變量的值S="木子"#通過(guò)類(lèi)名訪問(wèn),設(shè)置類(lèi)屬性值print((,))#讀取成員變量的值="吳怡晴"#通過(guò)實(shí)例對(duì)象訪問(wèn),設(shè)置實(shí)例對(duì)象成員變量的值print((,))#讀取成員變量的值運(yùn)行結(jié)果:1初心('初心','初心')('木子','木子')('吳怡晴','木子')6.3.3實(shí)例對(duì)象屬性與類(lèi)對(duì)象屬性區(qū)別與聯(lián)系類(lèi)對(duì)象屬性與實(shí)例對(duì)象屬性的區(qū)別類(lèi)對(duì)象屬性是在類(lèi)中所有成員方法外部以“類(lèi)名.屬性名”形式定義的,實(shí)例對(duì)象屬性則是在構(gòu)造方法或其他實(shí)例方法中以“self.屬性名”形式定義的。2.定義的位置和方法不同類(lèi)對(duì)象屬性是通過(guò)類(lèi)對(duì)象以“類(lèi)名.屬性名”形式訪問(wèn)的,實(shí)例對(duì)象屬性則是通過(guò)類(lèi)實(shí)例以“對(duì)象名.屬性名”形式訪問(wèn)的。3.訪問(wèn)的方法不同類(lèi)對(duì)象屬性屬于類(lèi)對(duì)象本身,可以由類(lèi)的所有實(shí)例共享,在內(nèi)存中只存在一個(gè)副本;實(shí)例對(duì)象屬性則屬于類(lèi)的某個(gè)特定實(shí)例。如果存在同名的類(lèi)對(duì)象屬性和實(shí)例對(duì)象屬性,則兩者相互獨(dú)立、互不影響。1.所屬的對(duì)象不同6.3.3實(shí)例對(duì)象屬性與類(lèi)對(duì)象屬性區(qū)別與聯(lián)系類(lèi)對(duì)象屬性與實(shí)例對(duì)象屬性的聯(lián)系類(lèi)對(duì)象和實(shí)例對(duì)象都是對(duì)象,它們所屬的類(lèi)都可以通過(guò)__class__屬性來(lái)獲取,類(lèi)對(duì)象屬于type類(lèi),實(shí)例對(duì)象則屬于創(chuàng)建該實(shí)例時(shí)所調(diào)用的類(lèi)。類(lèi)對(duì)象和實(shí)例對(duì)象的屬性值都可以通過(guò)__dict__屬性來(lái)獲取,該屬性的取值是一個(gè)字典,每個(gè)字典元素的關(guān)鍵字和值分別對(duì)應(yīng)屬性名與屬性值。如果要讀取的某個(gè)實(shí)例對(duì)象屬性不存在,但在類(lèi)中定義了一個(gè)與其同名的類(lèi)對(duì)象屬性,則Python就會(huì)以這個(gè)類(lèi)對(duì)象屬性的值作為實(shí)例對(duì)象屬性的值,同時(shí)還會(huì)創(chuàng)建一個(gè)新的實(shí)例對(duì)象屬性。成員屬性與成員方法
成員屬性成員方法6.46.4.1成員屬性封裝是面向?qū)ο蟮闹饕匦浴K^封裝,是把客觀事物抽象并封裝成對(duì)象,即將數(shù)據(jù)成員、屬性、方法和事件等集合在一個(gè)整體內(nèi)。通過(guò)訪問(wèn)控制可以隱藏內(nèi)部成員,但只允許可信的對(duì)象訪問(wèn)或操作自己的部分?jǐn)?shù)據(jù)或方法。封裝保證了對(duì)象的獨(dú)立性,可以防止外部程序破壞對(duì)象的內(nèi)部數(shù)據(jù),同時(shí)便于程序的維護(hù)和修改。6.4.1成員屬性成員屬性根據(jù)訪問(wèn)限制,可以分為私有屬性和公有屬性。Python類(lèi)的成員沒(méi)有訪問(wèn)控制限制,這與其他面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言不同。通常約定使用兩個(gè)下畫(huà)線(xiàn)開(kāi)頭,但是不以?xún)蓚€(gè)下畫(huà)線(xiàn)結(jié)束的屬性是私有的(private),其他為公共的(public)。不能直接訪問(wèn)私有屬性,但可以在方法中訪問(wèn)。Python中通過(guò)一對(duì)前綴下劃線(xiàn)“__”的屬性名來(lái)定義私有屬性。__private_attrs:兩個(gè)下劃線(xiàn)開(kāi)頭,聲明該屬性為私有,不能在類(lèi)的外部被使用或直接訪問(wèn)。6.4.1成員屬性例【6-5】私有屬性與公有屬性的定義與訪問(wèn)。classCustom(object):def__init__(self,name,money):=nameself.__money=moneyc=Custom('tom',100)print()print(c.__money)運(yùn)行結(jié)果:Traceback(mostrecentcalllast):tomFile"C:/python_demo/demo.py",line13,in<module>print(c.__money)AttributeError:'Custom'objecthasnoattribute'__money'在Custom類(lèi)中,實(shí)現(xiàn)了兩個(gè)屬性,其中name是普通屬性,__money屬性是私有屬性。在通過(guò)類(lèi)對(duì)象訪問(wèn)私有屬性__money時(shí),代碼報(bào)錯(cuò)了,說(shuō)明我們不可以在類(lèi)的外部訪問(wèn)類(lèi)的私有屬性。6.4.1成員屬性例【6-6】私有成員的訪問(wèn)。classCustom(object):def__init__(self,name):=namedefget_money(self):returnself.__moneydefset_money(self,money):ifmoney>0:self.__money=moneyelse:self.__money=0print('參數(shù)值錯(cuò)誤!')c=Custom('tom')print()='TOM'print()c.set_money(-100)c.set_money(100)print(c.get_money())運(yùn)行結(jié)果:tomTOM參數(shù)值錯(cuò)誤!100非私有屬性可以在類(lèi)的外部訪問(wèn)和修改,而私有屬性只能通過(guò)包含set的方法來(lái)修改。6.4.2成員方法1.類(lèi)的成員方法定義方法是與類(lèi)相關(guān)的函數(shù),類(lèi)方法的定義與普通的函數(shù)一致。一般情況下,類(lèi)方法的第一個(gè)參數(shù)一般為self,這種方法稱(chēng)之為對(duì)象實(shí)例方法。對(duì)象實(shí)例方法對(duì)類(lèi)的某個(gè)給定的實(shí)例進(jìn)行操作,可以通過(guò)self顯式地訪問(wèn)該實(shí)例。除了self不用傳遞,其他參數(shù)正常傳入即可。成員方法的聲明格式如下:def方法名(self,[形參列表]):函數(shù)體對(duì)象實(shí)例方法的調(diào)用格式如下:對(duì)象.方法名([實(shí)參列表])雖然類(lèi)方法的第一個(gè)參數(shù)為self,但調(diào)用時(shí),用戶(hù)不需要也不能給該參數(shù)傳值。事實(shí)上,Python自動(dòng)把對(duì)象實(shí)例傳遞給該參數(shù)。注意6.4.2成員方法2.類(lèi)方法的使用例【6-7】類(lèi)方法的應(yīng)用示例。classStudent(object):def__init__(self,name,age):=nameself.age=agedefprint_tell(self):print('%s:%d'%(,self.age))stu_1=Student('初心',18)stu_1.print_tell()運(yùn)行結(jié)果:初心:18我們從外部看Student類(lèi),就只需要知道,創(chuàng)建實(shí)例需要給出name和age,而如何打印等都是在Student類(lèi)的內(nèi)部定義的,這些數(shù)據(jù)和邏輯被“封裝”起來(lái)了,調(diào)用很容易,卻不用知道內(nèi)部實(shí)現(xiàn)的細(xì)節(jié)。通過(guò)類(lèi)的實(shí)例名稱(chēng)和“.”操作符進(jìn)行訪問(wèn)。即instanceName.functionName()6.4.2成員方法3.構(gòu)造方法和析構(gòu)函數(shù)構(gòu)造方法(函數(shù))是創(chuàng)建對(duì)象的過(guò)程中被調(diào)用的第一個(gè)方法,通常用于初始化對(duì)象中需要的資源,比如初始化變量。在定義構(gòu)造方法時(shí),需要在方法名的兩側(cè)加兩個(gè)下劃線(xiàn),構(gòu)造方法名為init。完整的構(gòu)造方法:__init__()(前后分別為兩個(gè)下畫(huà)線(xiàn))
。每當(dāng)創(chuàng)建類(lèi)的實(shí)例化對(duì)象的時(shí)候,__init__()方法都會(huì)默認(rèn)被運(yùn)行。其作用就是初始化已實(shí)例化后的對(duì)象。析構(gòu)函數(shù):__del__(),用來(lái)釋放對(duì)象占用的資源。當(dāng)一個(gè)對(duì)象被刪除時(shí),Python解釋器會(huì)默認(rèn)調(diào)用__del__()方法。6.4.2成員方法3.構(gòu)造方法和析構(gòu)函數(shù)例【6-8】初始化函數(shù)__init__()的應(yīng)用。classStudent():def__init__(self,Name,Sex):=Nameself.sex=Sexprint(self.__class__)#驗(yàn)證初始化是否執(zhí)行
defshowInfo(self,country):print('我是:',,',性別:',self.sex,'來(lái)自',country)xiaoming=Student("辛里美","女")xiaoming.showInfo('中國(guó)')#調(diào)用對(duì)象的方法運(yùn)行結(jié)果:<class'__main__.Student'>我是:辛里美,性別:女來(lái)自中國(guó)6.4.2成員方法4.私有方法的定義與訪問(wèn)私有方法,方法名有兩個(gè)前綴下劃線(xiàn)'__',則表明該方法是私有方法。__private_method:兩個(gè)下劃線(xiàn)開(kāi)頭,聲明該方法為私有方法,不能在類(lèi)的外部調(diào)用。在類(lèi)的內(nèi)部調(diào)用self.__private_methods。6.4.2成員方法例【6-9】類(lèi)的私有方法的定義與使用。classInterviewer(object):def__init__(self):self.wage=0defask_question(self):print('asksomequestion!')def__talk_wage(self):print('Calculatewage!')deftalk_wage(self):ifself.wage>20000:print('toohigh!')else:self.__talk_wage()print('welcometojoinus!')me=Interviewer()me.ask_question()#me.__talk_wage()me.wage=30000me.talk_wage()print('-'*20)me.wage=15000me.talk_wage()運(yùn)行結(jié)果:asksomequestion!toohigh!--------------------Calculatewage!welcometojoinus!ask_question()方法是普通的方法,在類(lèi)的外部可以直接調(diào)用,__talk_wage()方法是私有方法,只能在類(lèi)的內(nèi)部使用,如果在外部寫(xiě)調(diào)用的代碼則報(bào)錯(cuò)。6.4.2成員方法5.私有方法的作用和說(shuō)明私有屬性和私有方法只能在類(lèi)內(nèi)部使用。定義私有方法和私有屬性的目的主要有兩個(gè):保護(hù)數(shù)據(jù)或操作的安全性、向使用者隱藏核心開(kāi)發(fā)細(xì)節(jié)。雖然私有屬性和私有方法不能直接從外部訪問(wèn)和修改,但是通過(guò)間接的方法,可以獲取和修改。在Python類(lèi)中,沒(méi)有真正的私有屬性和私有方法。這并不是說(shuō)私有屬性和私有方法沒(méi)有用,首先,外部不能直接使用了,其次,我們可以在訪問(wèn)私有屬性和私有方法的間接方法中做一些必要的驗(yàn)證或干擾,保證數(shù)據(jù)的安全性,隱藏私有方法的實(shí)現(xiàn)細(xì)節(jié)。6.4.2成員方法6.方法重載Python對(duì)象要重載,定義一個(gè)方法即可實(shí)現(xiàn)多種調(diào)用。例【6-10】方法重載的應(yīng)用示例。classStudent:#定義類(lèi)Studentdefsay_hi(self,name=None):#定義類(lèi)方法say_hi=name#把參數(shù)name賦值給,即成員變量name(域)
ifname==None:print('您好!')else:print('您好,我叫',)obj=Student()#創(chuàng)建對(duì)象obj.say_hi()#調(diào)用對(duì)象的方法,無(wú)參數(shù)obj.say_hi('吳怡晴')#調(diào)用對(duì)象的方法,帶參數(shù)運(yùn)行結(jié)果:您好!您好,我叫吳怡晴類(lèi)的繼承與多態(tài)類(lèi)的繼承與多重繼承多態(tài)與多態(tài)性6.56.5.1類(lèi)的繼承與多重繼承1.類(lèi)繼承的概念繼承是面向?qū)ο蟮某绦蛟O(shè)計(jì)中代碼重用的主要方法。在程序設(shè)計(jì)中實(shí)現(xiàn)繼承,表示這個(gè)類(lèi)擁有它繼承的類(lèi)的所有公有成員。在面向?qū)ο缶幊讨?,被繼承的類(lèi)稱(chēng)為父類(lèi)或基類(lèi),新的類(lèi)稱(chēng)為子類(lèi)或派生類(lèi)。具體的語(yǔ)法如下:classClassName(baseclasslist):statementClassName:用于指定類(lèi)名。baseclasslist:用于指定要繼承的基類(lèi),可以有多個(gè),類(lèi)名之間用逗號(hào)“,”分隔。如果不指定,將使用所有Python對(duì)象的根類(lèi)object。statement:類(lèi)體,主要由類(lèi)變量(或類(lèi)成員)、方法和屬性等定義語(yǔ)句組成。如果在定義類(lèi)時(shí),沒(méi)確定好類(lèi)的具體功能,也可以在類(lèi)體中直接使用pass語(yǔ)句代替。聲明派生類(lèi)時(shí),必須在其構(gòu)造函數(shù)中調(diào)用基類(lèi)的構(gòu)造函數(shù)。調(diào)用格式如下:基類(lèi)名.__init__(self,參數(shù)列表)super().__init__(參數(shù)列表)注意6.5.1類(lèi)的繼承與多重繼承1.類(lèi)繼承的概念例【6-11】創(chuàng)建基類(lèi)Animal,包含兩個(gè)數(shù)據(jù)成員name和age;創(chuàng)建派生類(lèi)Dog,包含一個(gè)數(shù)據(jù)成員color。#動(dòng)物類(lèi)classAnimal(object):def__init__(self,name,age):=nameself.age=age
defeat(self,food):print(f"我是{},{self.age}歲,愛(ài)吃:{food}")#創(chuàng)建Dog類(lèi)classDog(Animal):#從Animal繼承
def__init__(self,name,age,color):#構(gòu)造函數(shù)
Animal.__init__(self,name,age)#調(diào)用基類(lèi)構(gòu)造函數(shù)
self.color=color#顏色
defeat(self,food):Animal.eat(self,food)#調(diào)用基類(lèi)的eat()方法
print(f"我是{},顏色是{self.color},愛(ài)吃:{food}")lala=Animal("拉普拉多",3)#實(shí)例化對(duì)象lala.eat("魚(yú)罐頭")jinmao=Dog('金毛',2,'金黃')jinmao.eat('牛肉罐頭')運(yùn)行結(jié)果:我是拉普拉多,3歲,愛(ài)吃:魚(yú)罐頭我是金毛,2歲,愛(ài)吃:牛肉罐頭我是金毛,顏色是金黃,愛(ài)吃:牛肉罐頭6.5.1類(lèi)的繼承與多重繼承2.多重繼承如果在繼承中列了一個(gè)以上的類(lèi),那么它就被稱(chēng)作“多重繼承”。classA: #定義類(lèi)A…ClassB: #定義類(lèi)B…classc(A,B): #維承類(lèi)A和B…需要注意圓括號(hào)中父類(lèi)的順序,如果繼承的父類(lèi)中有相同的方法名,而在子類(lèi)中使用時(shí)未指定,python將從左至右查找父類(lèi)中是否包含方法。注意6.5.1類(lèi)的繼承與多重繼承2.多重繼承例【6-12】多重繼承應(yīng)用示例。classA(object):def__init__(self,name):=nameclassB(object):def__init__(self,age):self.age=ageclassC(A,B):def__init__(self,name,age):A.__init__(self,name)B.__init__(self,age)#實(shí)例化對(duì)象c=C('Marry',20)print()print(c.age)運(yùn)行結(jié)果:Marry206.5.1類(lèi)的繼承與多重繼承2.多重繼承例【6-13】私有方法、私有屬性不能被子類(lèi)繼承的示例。classFather(object):def__init__(self):self.home='China'self.__house='house'defmake_money(self):print('makemoney')def__project(self):print('projectwork')classSon(Father):defwork(self):print('worklikeadog!')s=Son()print(s.home)#print(s.__house)s.work()s.make_money()#s.__project()運(yùn)行結(jié)果:Chinaworklikeadog!makemoney在父類(lèi)中定義的普通屬性和普通方法,子類(lèi)都繼承了,子類(lèi)可以直接使用,但是父類(lèi)中的私有屬性和私有方法子類(lèi)無(wú)法直接使用,因?yàn)樽宇?lèi)不會(huì)繼承父類(lèi)的私有屬性和私有方法。如果想訪問(wèn),可以通過(guò)間接的方式訪問(wèn)。6.5.2多態(tài)與多態(tài)性1.多態(tài)的概念及應(yīng)用對(duì)象可以表示多個(gè)類(lèi)型的能力稱(chēng)為多態(tài)性。多態(tài)性允許每個(gè)對(duì)象以自己的方式去響應(yīng)共同的消息,從而允許用戶(hù)以更明確的方式建立通用軟件,提高軟件開(kāi)發(fā)的可維護(hù)性。從編程的角度來(lái)說(shuō),實(shí)現(xiàn)多態(tài),需要三個(gè)步驟:定義父類(lèi),并提供公共方法定義子類(lèi),并重寫(xiě)父類(lèi)方法傳遞子類(lèi)對(duì)象給調(diào)用者,可以看到不同子類(lèi)執(zhí)行效果不同。6.5.2多態(tài)與多態(tài)性1.多態(tài)的概念及應(yīng)用例【6-14】多態(tài)的概念示例。classAnimal:defrun(self):raiseAttributeError('子類(lèi)必須實(shí)現(xiàn)這個(gè)方法,否則報(bào)錯(cuò)。')classCat(Animal):defrun(self):print("貓可以行走。")classPig(Animal):defrun(self):print("豬可以走。")classDog(Animal):defrun(self):
print("狗可以走")ooc=Cat()oop=Pig()ood=Dog()ooc.run()oop.run()ood.run()運(yùn)行結(jié)果:貓可以行走。豬可以走。狗可以走6.5.2多態(tài)與多態(tài)性2.多態(tài)性的概念及應(yīng)用多態(tài)性指具有不同功能的函數(shù)可以使用相同的函數(shù)名,這樣就可以用一個(gè)函數(shù)名調(diào)用不同內(nèi)容的函數(shù)。專(zhuān)業(yè)說(shuō)法:向不同的對(duì)象發(fā)送同一條消息,不同的對(duì)象在接收時(shí)會(huì)產(chǎn)生不同的行為(方
法),即每個(gè)對(duì)象可以用自己的方式去響應(yīng)共同的消息。舉例:比如在桌面上單擊鼠標(biāo)的右鍵,選中我的電腦之后,單機(jī)鼠標(biāo)的右鍵,以及
在當(dāng)前的打開(kāi)word文檔中單機(jī)鼠標(biāo)的右鍵,這樣三個(gè)不同對(duì)象,發(fā)出鼠標(biāo)的
右鍵被按下,產(chǎn)生的菜單不一樣。所謂消息就是調(diào)用函數(shù),不同的行為就是指不同的實(shí)現(xiàn),即執(zhí)行不同的函數(shù)。6.5.2多態(tài)與多態(tài)性2.多態(tài)性的概念及應(yīng)用例【6-15】多態(tài)性的應(yīng)用示例。classAnimal:defrun(self):raiseAttributeError('子類(lèi)必須實(shí)現(xiàn)這個(gè)方法,否則報(bào)錯(cuò)。')classCat(Animal):defrun(self):print("貓可以行走。")classPig(Animal):defrun(self):print("豬可以走。")classDog(Animal):defrun(self):print("狗可以走")ooc=Cat()oop=Pig()ood=Dog()#利用多態(tài)行:定義統(tǒng)一接口。deffunc(obj):obj.run()func(ooc)func(oop)func(ood)綜合案例
簡(jiǎn)易銀行賬戶(hù)管理系統(tǒng)實(shí)現(xiàn)6.66.6綜合案例:簡(jiǎn)易銀行賬戶(hù)管理系統(tǒng)實(shí)現(xiàn)例【6-16】利用面向?qū)ο笤O(shè)計(jì)編程思想,創(chuàng)建一個(gè)簡(jiǎn)單的銀行賬戶(hù)管理系統(tǒng)。見(jiàn)教材運(yùn)行結(jié)果:見(jiàn)教材類(lèi)是用來(lái)描述具有相同的屬性和方法的對(duì)象的集合。對(duì)象是類(lèi)的實(shí)例。類(lèi)與對(duì)象的關(guān)系:用類(lèi)去創(chuàng)建(實(shí)例化)一個(gè)對(duì)象。開(kāi)發(fā)中,先有類(lèi),才有對(duì)象。通過(guò)class定義類(lèi),并創(chuàng)建類(lèi)的實(shí)例為類(lèi)名()。在構(gòu)建析構(gòu)函數(shù)時(shí),__init__()必須包含一
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 新型急救裝置全面解析
- 2025~2026學(xué)年濟(jì)南市天橋區(qū)七年級(jí)第一學(xué)期生物期末考試試題以及答案
- 2026年上海市金山區(qū)初三上學(xué)期一模數(shù)學(xué)試卷和參考答案
- 化工儀表基礎(chǔ)知識(shí)課件
- 特種設(shè)備管理制度
- 2026浙江溫州市平陽(yáng)縣長(zhǎng)汽機(jī)動(dòng)車(chē)駕駛員考試服務(wù)有限責(zé)任公司招聘編外人員(勞務(wù)派遣)3人備考考試題庫(kù)及答案解析
- 市政工程公司管理制度
- 2026年荊州市江陵縣事業(yè)單位人才引進(jìn)47人備考考試試題及答案解析
- 2026貴州貴陽(yáng)市觀山湖區(qū)第二初級(jí)中學(xué)招聘臨聘教師2人備考考試題庫(kù)及答案解析
- 裝飾水池施工方案(3篇)
- 城市社區(qū)工作者培訓(xùn)課件
- T-ZSA 232-2024 特種巡邏機(jī)器人通.用技術(shù)要求
- GB/T 45026-2024側(cè)掃聲吶海洋調(diào)查規(guī)范
- DB33 1121-2016 民用建筑電動(dòng)汽車(chē)充電設(shè)施配置與設(shè)計(jì)規(guī)范
- IATF16949基礎(chǔ)知識(shí)培訓(xùn)教材
- DBJ-T 15-162-2019 建筑基坑施工監(jiān)測(cè)技術(shù)標(biāo)準(zhǔn)
- 中國(guó)慢性阻塞性肺疾病基層診療指南(2024年)解讀
- QB/T 2660-2024 化妝水(正式版)
- 不確定度評(píng)定(壓力表-)
- 復(fù)方蒲公英注射液抗腫瘤作用研究
- 神經(jīng)性皮炎基層診療指南
評(píng)論
0/150
提交評(píng)論