




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Python3基礎(chǔ)教程第3版慕課版單元10面向?qū)ο笕蝿?wù)10-1:用類處理詩詞【任務(wù)目標(biāo)】定義一個類來處理詩詞,程序輸出結(jié)果如下。唐詩:塞下曲作者:盧綸月黑雁飛高,單于夜遁逃。欲將輕騎逐,大雪滿弓刀?!救蝿?wù)實(shí)施】演示過程……10.1Python類基礎(chǔ)本節(jié)主要內(nèi)容:理解Python的面向?qū)ο竽疃x和使用類對象的屬性10.1.1理解Python的面向?qū)ο驪ython具有類、對象、繼承、重載、多態(tài)等面向?qū)ο筇匦裕cC++、Java等支持面向?qū)ο蟮恼Z言又有所不同。1.面向?qū)ο蟮幕靖拍铑惡蛯ο螅好枋鰧ο髮傩院头椒ǖ募戏Q為類,它定義了同一類對象所共有的屬性和方法;對象是類的實(shí)例,也稱實(shí)例對象。方法:類中定義的函數(shù),用于描述對象的行為,也稱方法屬性。屬性:類中在所有方法之外定義的變量(也稱類的頂層變量),用于描述對象的特點(diǎn),也稱數(shù)據(jù)屬性。封裝:類具有封裝特性,其內(nèi)部實(shí)現(xiàn)不應(yīng)被外部知曉,只需要提供必要的接口供外部訪問即可。實(shí)例化:創(chuàng)建一個類的實(shí)例對象。繼承:從一個超類(也稱父類或基類)派生一個子類時,子類擁有超類的屬性和方法,稱為繼承。子類可以定義自己的屬性和方法。重載(override):在子類中定義與超類方法同名的方法,稱為子類對超類方法的重載,也稱方法重寫。多態(tài):指不同類型對象的相同行為產(chǎn)生不同的結(jié)果。與其他面向?qū)ο蟮某绦蛟O(shè)計語言相比,Python的面向?qū)ο蟾鼮楹唵巍?.Python的類和類型Python的類使用class語句來定義,類通常包含一系列的賦值語句和函數(shù)定義。賦值語句定義類的屬性,函數(shù)定義類的方法。在Python3中,類是一種自定義類型。Python的所有類型(包括自定義類型),都是內(nèi)置類型type的實(shí)例對象,例如,內(nèi)置的int、float、str等都是type類型的實(shí)例對象。type()函數(shù)可返回對象的類型,示例代碼>>>type(int)<class'type'>>>>type(float)<class'type'>>>>type(str)<class'type'>>>>classtest: #定義一個空類...pass...>>>type(test)<class'type'>3.Python中的對象Python中的一切數(shù)據(jù)都是對象,如整數(shù)、小數(shù)、字符串、函數(shù)、模塊等。例如,下面的代碼分別測試了字符串、整數(shù)、邏輯值和函數(shù)的類型。>>>type('abc')<class'str'>>>>type(123)<class'int'>>>>type(True)<class'bool'>>>>deffun():...pass...>>>type(fun)<class'function'>Python中的對象可分為兩種:類對象實(shí)例對象。類對象在執(zhí)行class語句時創(chuàng)建。類對象是可調(diào)用的,類對象也稱類實(shí)例。調(diào)用類對象會創(chuàng)建一個類的實(shí)例對象。類對象只有一個,而類的實(shí)例對象可以有多個。類對象和實(shí)例對象分別擁有自己的命名空間,在各自的命名空間內(nèi)使用對象的屬性和方法。1.類對象類對象具有下列幾個主要特點(diǎn)。Python在執(zhí)行class語句時創(chuàng)建一個類對象和一個變量(與類同名),變量引用類對象。與def類似,class也是可執(zhí)行語句。導(dǎo)入類模塊時,會執(zhí)行class語句。類中的頂層賦值語句創(chuàng)建的變量是類的數(shù)據(jù)屬性。類的數(shù)據(jù)屬性用“對象名.屬性名”格式來訪問。類中的頂層def語句定義的函數(shù)是類的方法屬性,用“對象名.方法名()”格式來訪問。類的數(shù)據(jù)屬性由類的所有實(shí)例對象共享。實(shí)例對象可讀取類的數(shù)據(jù)屬性值,但不能通過賦值語句修改類的數(shù)據(jù)屬性值。2.實(shí)例對象實(shí)例對象具有下列主要特點(diǎn)。實(shí)例對象通過調(diào)用類對象來創(chuàng)建。每個實(shí)例對象繼承類對象的所有屬性,并獲得自己的命名空間。實(shí)例對象擁有私有屬性。通過賦值語句為實(shí)例對象的屬性賦值時,如果該屬性不存在,就會創(chuàng)建屬于實(shí)例對象的私有屬性。10.1.2定義和使用類本節(jié)主要內(nèi)容:定義類使用類1.定義類類定義的基本格式如下。class類名:
賦值語句
賦值語句
…… def語句定義函數(shù)def語句定義函數(shù)
……classtestclass:data=100defsetpdata(self,value):self.pdata=valuedefshowpdata(self):print('self.pdata=',self.pdata)2.使用類使用類對象可訪問類的屬性、創(chuàng)建實(shí)例對象,示例代碼如下。>>>type(testclass) #測試類對象的類型<class'type'>>>>testclass.data #訪問類對象的數(shù)據(jù)屬性100>>>x=testclass() #調(diào)用類對象創(chuàng)建第1個實(shí)例對象>>>type(x) #查看實(shí)例對象的類型,交互環(huán)境中的默認(rèn)模塊名稱為__main__<class'__main__.testclass'> >>>x.setpdata('abc’) #調(diào)用方法創(chuàng)建實(shí)例對象的數(shù)據(jù)屬性pdata>>>x.showpdata() #調(diào)用方法顯示實(shí)例對象的數(shù)據(jù)屬性pdata的值self.pdata=abc>>>y=testclass() #調(diào)用類對象創(chuàng)建第2個實(shí)例對象>>>y.setpdata(123) #調(diào)用方法創(chuàng)建實(shí)例對象的數(shù)據(jù)屬性pdata>>>y.showpdata() #調(diào)用方法顯示實(shí)例對象的數(shù)據(jù)屬性pdata的值self.pdata=12310.1.3
對象的屬性從面向?qū)ο蟮慕嵌葋碚f,屬性表示對象的數(shù)據(jù),在實(shí)現(xiàn)時通常用變量表示;方法表示對象的行為,實(shí)現(xiàn)時通常用函數(shù)表示。Python把類中的變量和函數(shù)統(tǒng)稱為屬性,分別稱為數(shù)據(jù)屬性和方法屬性。在Python中,實(shí)例對象擁有類對象的所有屬性??梢杂胐ir()函數(shù)來查看對象的屬性示例代碼如下。#test10_06.py:查看對象的屬性fromtest10_04importtest #導(dǎo)入類x=test(50) #創(chuàng)建實(shí)例對象print(dir(test)) #查看對象的屬性1.共享屬性類對象的數(shù)據(jù)屬性由類的所有實(shí)例對象共享。test類的頂層賦值語句“data=100”定義了類對象的屬性data,該屬性可由所有實(shí)例對象共享。需要注意的是,類對象的屬性由所有實(shí)例對象共享,其屬性的值只能通過類對象來修改。可用del語句刪除對象的屬性,示例代碼如下。#test10_07.py:使用類對象的共享屬性fromtest10_04importtest #導(dǎo)入類x=test(50) #創(chuàng)建實(shí)例對象y=test(30) #創(chuàng)建實(shí)例對象print(x.data,y.data) #訪問共享屬性test.data=200 #通過類對象修改共享屬性值print(x.data,y.data)test.data=300print(x.data,y.data,test.data) #此時訪問的都是共享屬性x.data="abc" #此時創(chuàng)建x的私有屬性dataprint(x.data,y.data,test.data) #x.data訪問的是x的私有屬性datatest.data=400print(x.data,y.data,test.data)delx.data #此時刪除x的私有屬性dataprint(x.data) #x.data訪問類對象的共享屬性在以“實(shí)例對象.屬性名”格式訪問屬性時:Python首先檢查實(shí)例對象是否有匹配的私有屬性,如果有則返回該屬性的值;如果沒有,則進(jìn)一步檢查類對象是否有匹配的共享屬性,如果有則返回該屬性的值;如果也沒有,則產(chǎn)生AttributeError異常。2.實(shí)例對象的私有屬性實(shí)例對象的私有屬性指獨(dú)屬于實(shí)例對象的屬性,私有屬性在類外部可以以“實(shí)例對象名.屬性名=值”格式賦值創(chuàng)建,或者在類的方法中以“self.屬性名=值”格式賦值創(chuàng)建。“私有”強(qiáng)調(diào)屬性只屬于當(dāng)前實(shí)例對象。實(shí)例對象默認(rèn)擁有繼承自類對象的所有屬性,沒有私有屬性。只有通過賦值為實(shí)例對象創(chuàng)建私有屬性,示例代碼如下。#test10_08.py:使用實(shí)例對象的私有屬性fromtest10_04importtest
#導(dǎo)入類x=test(100) #創(chuàng)建實(shí)例對象,初始化私有屬性sdataprint(x.sdata) #訪問實(shí)例對象的私有屬性x.pdata=200 #創(chuàng)建私有屬性print(x.pdata) #訪問私有屬3.對象的屬性是動態(tài)的Python總是在第一次給變量賦值時創(chuàng)建變量。對于類對象或?qū)嵗龑ο蠖裕?dāng)給不存在的屬性賦值時,Python為其創(chuàng)建屬性示例代碼如下。#test10_09.py:對象屬性的動態(tài)性fromtest10_04importtest
#導(dǎo)入類x=test(100) #創(chuàng)建實(shí)例對象,初始化私有屬性sdatatest.data2="abc" #賦值,為類對象創(chuàng)建屬性x.data3=[1,2] #賦值,為實(shí)例對象創(chuàng)建屬性print(test.data2,x.data2,x.data3) #訪問屬性print(dir(test)) #查看類對象的屬性列表print(dir(x))可以看到,賦值操作為對象添加了屬性。而且,為類對象添加了屬性時,實(shí)例對象也自動擁有了該屬性。10.1.4對象的方法在通過實(shí)例對象訪問方法時,Python會創(chuàng)建一個特殊對象:綁定方法對象,也稱實(shí)例方法對象。此時,當(dāng)前實(shí)例對象會作為一個參數(shù)傳遞給實(shí)例方法對象。所以在定義方法時,通常第一個參數(shù)名稱為self。使用self只是慣例,重要的是位置,完全可以用其他的名稱來代替self。通過類對象訪問方法時,不會將類對象傳遞給方法,應(yīng)按方法定義的形參個數(shù)提供參數(shù),這和通過實(shí)例對象訪問方法有所區(qū)別#test10_10.py:通過類對象調(diào)用方法classtest:defadd(a,b):returna+b #定義方法,完成加法defadd2(self,a,b):returna+b #定義方法,完成加法print(test.add(2,3)) #通過類對象調(diào)用方法print(test.add2(2,3,4)) #通過類對象調(diào)用方法,此時參數(shù)self的值為2x=test() #創(chuàng)建實(shí)例對象print(x.add2(2,3)) #通過實(shí)例對象調(diào)用方法,完成加法print(x.add(2,3)) #出錯,輸出信息顯示函數(shù)接收到3個參10.1.5特殊屬性和方法Python會為類對象添加一系列特殊屬性,常用特殊屬性如下。__name__:返回為類的名稱。__module__:返回類所在模塊的名稱。__dict__:返回包含類命名空間的字典。__bases__:返回包含基類的元組,按其在基類列表中的出現(xiàn)順序排列。__doc__:返回類的文檔字符串,如果沒有則為None。__class__:返回類對象的類型名稱,與type()的返回結(jié)果相同。#test10_11.py:特殊屬性classtest:"""這是test類的文檔字符串"""pass#定義一個空類print(test.__name__)print(test.__module__)print(test.__dict__)print(test.__base__)print(test.__doc__)print(test.__class__)Python會為類對象添加一系列特殊方法,這些特殊方法在執(zhí)行特定操作時被調(diào)用。可在定義類時定義這些方法,以取代默認(rèn)方法,這稱為方法的重載。類對象常用的特殊方法如下。__eq__():計算x==y時調(diào)用x.__eq__(y)。__ge__():計算x>=y時調(diào)用x.__ge__(y)。__gt__():計算x>y時調(diào)用x.__gt__(y)。__le__():計算x<=y時調(diào)用x.__le__(y)。__lt__():計算x<y時調(diào)用x.__lt__(y)。__ne__():計算x!=y時調(diào)用x.__ne__(y)。__format__():在內(nèi)置函數(shù)format()和str.format()方法中格式化對象時調(diào)用,返回對象的格式化字符。__dir__():執(zhí)行dir(x)時調(diào)用x.__dir__()。__delattr__():執(zhí)行delx.data時調(diào)用x.__delattr__(data)。__getattribute__():訪問對象屬性時調(diào)用。例如,a=x.data等同于a=x.__getattribute__(data)。__setattr__():為對象屬性賦值時調(diào)用。例如,x.data=a等同于x.__setattr__(a)。__hash__():調(diào)用內(nèi)置函數(shù)hash(x)時,調(diào)用x.__hash__()。__new__():創(chuàng)建類的實(shí)例對象時調(diào)用。__init__():類的初始化函數(shù)。例如,x=test()語句在創(chuàng)建test類的實(shí)例對象時,首先調(diào)用__new__()創(chuàng)建一個新的實(shí)例對象,然后調(diào)用__init__()執(zhí)行初始化操作。完成初始化之后再返回實(shí)例對象,同時建立變量x對實(shí)例對象的引用。__repr__():調(diào)用內(nèi)置函數(shù)repr(x)的同時調(diào)用x.__repr__(),返回對象的字符串表示。__str__():通過str(x)、print(x)以及在format()中格式化x時調(diào)用x.__str__(),返回對象的字符串表示。10.1.6“偽私有”屬性和方法在Python中,可以使用“類對象名.屬性名”或“實(shí)例對象名.屬性名”的格式在類的外部訪問類的屬性。在面向?qū)ο蠹夹g(shù)理論中,這種格式破壞了類的封裝特性。Python提供了一種折中的方法,即使用雙下畫線作為屬性和方法的名稱前綴,從而使這些屬性和方法不能直接在類的外部使用。以雙下畫線作為名稱前綴的屬性和方法稱為類的“偽私有”屬性和方法。Python在處理“偽私有”屬性和方法的名稱時,會加上“_類名”作為前綴。之所以稱為“偽私有”,是因?yàn)橹灰褂谜_的名稱,在類的外部也可以訪問“偽私有”屬性和方法??墒褂胐ir()函數(shù)查看類對象的“偽私有”屬性和方法的真正名稱。示例代碼如下。#test10_12.py:“偽私有”屬性和方法classtest:data=100__data2=200 #定義“偽私有”屬性defadd(a,b):returna+bdef__sub(a,b): #定義“偽私有”方法returna-bprint(test.data) #訪問普通屬性print(test.add(2,3)) #訪問普通方法print(test._test__data2) #訪問“偽私有”屬性print(test._test__sub(2,3)) #訪問“偽私有”方法print(dir(test))print(test.__data2) #訪問“偽私有”屬性,出錯,屬性不存在10.1.7對象的初始化Python類的__init__()函數(shù)用于完成對象的初始化。如果沒有為類定義__init__()函數(shù),Python會自動添加該函數(shù)。類對象在執(zhí)行__new__()函數(shù)創(chuàng)建完實(shí)例對象時,會立即調(diào)用__init__()函數(shù)對實(shí)例對象執(zhí)行初始化操作。示例代碼如下。#test10_13.py:對象的初始化classtest:def__init__(self,value): #定義對象的初始化方法self.data=value #為實(shí)例對象創(chuàng)建私有屬性print("實(shí)例對象初始化完畢")x=test(100) #調(diào)用類對象創(chuàng)建實(shí)例對象,自動調(diào)用對象的初始化方法print(x.data) #輸出實(shí)例對象已初始化的屬性10.1.8靜態(tài)方法可使用@staticmethod將方法聲明為靜態(tài)方法。通過實(shí)例對象調(diào)用靜態(tài)方法時,不會像普通方法一樣將實(shí)例對象本身作為隱含的第一個參數(shù)傳遞給方法。通過類對象和實(shí)例對象調(diào)用靜態(tài)方法的效果完全相同。示例代碼如下。#test10_14.py:靜態(tài)方法classtest:@staticmethod #聲明下面的add()為靜態(tài)方法defadd(a,b):returna+bprint(test.add(2,3)) #通過類對象調(diào)用靜態(tài)方法x=test() #創(chuàng)建實(shí)例對象print(x.add(3,5)) #通過實(shí)例對象調(diào)用靜態(tài)方法任務(wù)10-2:用類表示圓和橢圓【任務(wù)目標(biāo)】定義一個類表示圓,并將其作為超類定義一個表示橢圓的子類,程序輸出結(jié)果如下。圓,面積:12.56橢圓,面積:18.84【任務(wù)實(shí)施】演示過程……10.2類的繼承本節(jié)主要內(nèi)容:簡單繼承擴(kuò)展子類重繼承調(diào)用超類的初始化函數(shù)使用模塊中的類10.2.1簡單繼承通過繼承來定義新類的基本格式如下。class子類名(超類名):
子類代碼classsuper_class:#定義超類data=100__data2=200defshowinfo(self):print('超類showinfo()方法中的輸出信息')def__showinfo(self):print('超類__showinfo()方法中的輸出信息')classsub_class(super_class):#定義空的子類,pass表示空操作pass super=dir(super_class) #獲得超類的屬性和方法列表sub=dir(sub_class) #獲得子類的屬性和方法列表print(super==sub) #結(jié)果為True,說明超類和子類擁有的屬性和方法相同print(sub_class.data) #訪問繼承的屬性print(sub_class._super_class__data2)
#訪問繼承的屬性x=sub_class() #創(chuàng)建子類的實(shí)例對象x.showinfo() #調(diào)用繼承的方法x._super_class__showinfo() #調(diào)用繼承的方法10.2.2擴(kuò)展子類Python允許在子類中定義屬性和方法。子類定義的屬性和方法會覆蓋超類中的同名屬性和方法。在子類中定義與超類方法同名的方法,稱為方法的重載,classsuper_class:#定義超類data1=10data2=20defshow1(self):print('在超類的show1()方法中的輸出')defshow2(self):print('在超類的show2()方法中的輸出')classsub(super_class): #定義子類data1=100 #覆蓋超類的同名屬性defshow1(self): #重載超類的同名方法print('在子類的show1()方法中的輸出')print([xforxindir(sub)ifnotx.startswith('__')])
#顯示子類的非內(nèi)置屬性x=sub() #創(chuàng)建子類的實(shí)例對象print(x.data1,x.data2)
#data1是子類自定義的屬性,data2是子類繼承的屬性x.show1() #調(diào)用子類自定義的方法x.show2() #調(diào)用子類繼承的方法在子類中,可用super()函數(shù)返回超類的類對象,從而通過它訪問超類的方法。也可直接使用類對象調(diào)用超類的方法,示例代碼如下。classsuper_class: #定義超類data1=10data2=20defshow1(self):print('self.data1=',self.data1)defshow2(self):print('self.data2=',self.data2)classsub(super_class):#定義子類data1=100defshow(self):super_class.show1(self)#調(diào)用超類的方法super().show2() #調(diào)用超類的方法x=sub()x.show1()x.show()10.2.3多重繼承多重繼承指子類可以同時繼承多個超類。如果超類中存在同名的屬性或方法,Python按照從左到右的順序在超類中搜索方法10.2.4調(diào)用超類的初始化函數(shù)在子類的初始化函數(shù)中,通常應(yīng)調(diào)用超類的初始化函數(shù),Python不會自動調(diào)用超類的初始化函數(shù),示例代碼如下。#test10_20.py:調(diào)用超類的初始化函數(shù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 混凝土施工過程中的氣候適應(yīng)性施工方案
- 水痘疫苗培訓(xùn)課件
- 杖類助行器腋拐山東醫(yī)學(xué)高等??茖W(xué)??祻?fù)醫(yī)學(xué)教研室72課件
- 水電安裝基礎(chǔ)知識培訓(xùn)課件
- 2025版老房改造砌墻抹灰加固合同范本
- 二零二五年典當(dāng)業(yè)務(wù)風(fēng)險評估與應(yīng)對咨詢合同
- 二零二五年度工業(yè)地產(chǎn)項(xiàng)目開發(fā)商合同
- 二零二五年度車輛租賃續(xù)約合同:新能源車輛租賃服務(wù)
- 二零二五版建筑行業(yè)公對公借條及對公借款合同范本
- 2025版綜合能源服務(wù)項(xiàng)目施工廉政監(jiān)督協(xié)議
- 2023分布式光伏電站安裝作業(yè)指導(dǎo)書
- 紅星照耀中國選擇題及答案50道
- 開放性傷口止血包扎技術(shù)課件
- 重癥患者中心靜脈導(dǎo)管管理中國專家共識(2022版)
- 環(huán)境綜合應(yīng)急預(yù)案
- 氯甲烷泄露應(yīng)急預(yù)案
- 2.PaleoScan詳細(xì)操作流程
- PLC西門子S7-1200應(yīng)用技術(shù)完整全套教學(xué)課件
- 蘇州銀行總行信息科技部招聘考試真題2022
- 安裝電工電氣調(diào)試員安全技術(shù)操作規(guī)程
- 2乳的驗(yàn)收與預(yù)處理解析
評論
0/150
提交評論