




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
《Python語言程序設(shè)計(jì)》項(xiàng)目十類與對象高級應(yīng)用Contents類方法和靜態(tài)方法__slots__和@property裝飾器元類的用法單例模式類方法PART01類方法是指使用@classmethod修飾的方法,其第一個(gè)參數(shù)是類本身(而不是類的實(shí)例對象)。類方法的特點(diǎn)是既可以通過類名直接調(diào)用,也可以通過類的實(shí)例對象調(diào)用。類方法類方法【任務(wù)描述】使用@classmethod修飾【關(guān)鍵步驟】使用@classmethod修飾示例011 classComplex:#定義Complex類2 def__init__(self,real=0,image=0):#定義構(gòu)造方法3 self.real=real#初始化一個(gè)復(fù)數(shù)的實(shí)部值4 self.image=image#初始化一個(gè)復(fù)數(shù)的虛部值5 @classmethod6 defadd(cls,c1,c2):#定義類方法add,實(shí)現(xiàn)兩個(gè)復(fù)數(shù)的加法運(yùn)算7 print(cls)#輸出cls8 c=Complex()#創(chuàng)建Complex類對象c9 c.real=c1.real+c2.real#實(shí)部相加10 c.image=c1.image+c2.image#虛部相加11 returnc12 if__name__=='__main__':13 c1=Complex(1,2.5)14 c2=Complex(2.2,3.1)15 c=Complex.add(c1,c2)#直接使用類名調(diào)用類方法add16 print('c1+c2的結(jié)果為%.2f+%.2fi'%(c.real,c.image))類方法使用示例:類方法示例01<class'__main__.Complex'>c1+c2的結(jié)果為3.20+5.60i程序執(zhí)行完畢后,將在屏幕上輸出如下結(jié)果:類方法示例01靜態(tài)方法PART02靜態(tài)方法是指使用@staticmethod修飾的方法。與類方法相同,靜態(tài)方法既可以直接通過類名調(diào)用,也可以通過類的實(shí)例對象調(diào)用。與類方法不同的地方在于,靜態(tài)方法中沒有類方法中的第一個(gè)類參數(shù)。靜態(tài)方法靜態(tài)方法【任務(wù)描述】使用@staticmethod修飾【關(guān)鍵步驟】使用@staticmethod修飾示例021 classComplex:#定義Complex類2 def__init__(self,real=0,image=0):#定義構(gòu)造方法3 self.real=real#初始化一個(gè)復(fù)數(shù)的實(shí)部值4 self.image=image#初始化一個(gè)復(fù)數(shù)的虛部值5 @staticmethod6 defadd(c1,c2):#定義類方法add,實(shí)現(xiàn)兩個(gè)復(fù)數(shù)的加法運(yùn)算7 c=Complex()#創(chuàng)建Complex類對象c8 c.real=c1.real+c2.real#實(shí)部相加9 c.image=c1.image+c2.image#虛部相加10 returnc11 if__name__=='__main__':12 c1=Complex(1,2.5)13 c2=Complex(2.2,3.1)14 c=Complex.add(c1,c2)#直接使用類名調(diào)用類方法add15 print('c1+c2的結(jié)果為%.2f+%.2fi'%(c.real,c.image))靜態(tài)方法使用示例:靜態(tài)方法示例02c1+c2的結(jié)果為3.20+5.60i程序執(zhí)行完畢后,將在屏幕上輸出如下結(jié)果:靜態(tài)方法示例02動(dòng)態(tài)擴(kuò)展類與實(shí)例PART03Python作為一種動(dòng)態(tài)語言,除了可以在定義類時(shí)定義屬性和方法外,還可以動(dòng)態(tài)地為已經(jīng)創(chuàng)建的對象綁定新的屬性和方法。動(dòng)態(tài)擴(kuò)展類與實(shí)例動(dòng)態(tài)擴(kuò)展類與實(shí)例【任務(wù)描述】為對象動(dòng)態(tài)綁定對象和方法【關(guān)鍵步驟】為對象動(dòng)態(tài)綁定對象和方法示例031 fromtypesimportMethodType#從types模塊中導(dǎo)入MethodType方法2 classStudent:#定義學(xué)生類3 pass4 defSetName(self,name):#定義SetName函數(shù)5 =name6 defSetSno(self,sno):#定義SetSno函數(shù)7 self.sno=sno8 if__name__=='__main__':9 stu1=Student()#定義Student類對象stu110 stu2=Student()#定義Student類對象stu211 stu1.SetName=MethodType(SetName,stu1)#為stu1對象綁定SetName方法12 Student.SetSno=SetSno#為Student類綁定SetSno方法13 stu1.SetName('李曉明')14 stu1.SetSno('1810100')15 #stu2.SetName('張剛')16 stu2.SetSno('1810101')綁定新方法示例:動(dòng)態(tài)擴(kuò)展類與實(shí)例示例03__slots__PART04__slots__【任務(wù)描述】了解__slots__的用法【關(guān)鍵步驟】了解__slots__的用法示例041 classPerson:#定義Person類2 __slots__=('name')#定義允許動(dòng)態(tài)擴(kuò)展的屬性3 classStudent(Person):#以Person類作為父類定義子類Student類4 __slots__=('sno')#定義允許動(dòng)態(tài)擴(kuò)展的屬性5 classPostgraduate(Student):#以Student類作為父類定義子類Postgraduate類6 pass7 if__name__=='__main__':8 stu=Student()#定義Student類對象stu9 stu.sno='1810100'#為stu對象動(dòng)態(tài)擴(kuò)展屬性sno10 ='李曉明'#為stu對象動(dòng)態(tài)擴(kuò)展屬性name11 #stu.tutor='馬紅'#取消前面的注釋符則會(huì)報(bào)錯(cuò)12 pg=Postgraduate()#定義Postgraduate類對象pg13 pg.sno='1810101'#為pg對象動(dòng)態(tài)擴(kuò)展屬性sno14 ='張剛'#為pg對象動(dòng)態(tài)擴(kuò)展屬性name15 pg.tutor='馬紅'#為pg對象動(dòng)態(tài)擴(kuò)展屬性tutor__slots__變量以限制可動(dòng)態(tài)擴(kuò)展的屬性。例如,如果我們希望Student類中只能動(dòng)態(tài)擴(kuò)展sno和name屬性:__slots__示例04@propertyPART05@property裝飾器,可以將類中屬性的訪問和賦值操作自動(dòng)轉(zhuǎn)為方法調(diào)用,這樣可以在方法中對屬性值的取值范圍做一些條件限定。@property@property【任務(wù)描述】了解@property的用法【關(guān)鍵步驟】了解@property的用法示例051 importdatetime2 classStudent:#定義Student類3 @property4 defscore(self):#用@property裝飾器定義一個(gè)用于獲取score值的方法5 returnself._score6 @score.setter7 defscore(self,score):#用score.setter定義一個(gè)用于設(shè)置score值的方法8 ifscore<0orscore>100:#不符合0~100的限定條件9 print('成績必須在0~100之間!')10 else:11 self._score=score12 @property13 defage(self):#用@property裝飾器定義一個(gè)用于獲取age值的方法14 returndatetime.datetime.now().year-self.birthyear15 if__name__=='__main__':16 stu=Student()#創(chuàng)建Student類對象stu17 stu.score=80#將stu對象的score屬性賦值為8018 stu.birthyear=2000#將stu對象的birthyear屬性賦值為200019 print('年齡:%d,成績:%d'%(stu.age,stu.score))20 #stu.age=19#取消前面的注釋符則會(huì)報(bào)錯(cuò)21 stu.score=105#將stu對象的score屬性賦值為10522 print('年齡:%d,成績:%d'%(stu.age,stu.score))@property示例05年齡:18,成績:80成績必須在0~100之間!年齡:18,成績:80程序執(zhí)行完畢后,將在屏幕上輸出如下結(jié)果:@property示例05元類(metaclass)PART06元類(metaclass)【任務(wù)描述】了解元類(metaclass)的用法【關(guān)鍵步驟】了解元類(metaclass)的用法示例061 classStudent:#定義Student類2 pass3 stu=Student()#定義Student類的對象stu4 print('stu所屬的類是:',stu.__class__)#使用__class__屬性獲取所屬的類5 print('Student所屬的類是:',Student.__class__)元類(metaclass)可以看成是創(chuàng)建類時(shí)所使用的模板,也可以理解為是用于創(chuàng)建類的類。stu所屬的類是:<class'__main__.Student'>Student所屬的類是:<class'type'>程序執(zhí)行完畢后,將在屏幕上輸出如下結(jié)果:元類(metaclass)示例06單例模式PART07單例模式(SingletonPattern)是指在程序運(yùn)行時(shí)確保某個(gè)類最多只有一個(gè)實(shí)例對象。例如A類采用單例模式,則當(dāng)創(chuàng)建A類對象時(shí)需要判斷是否已存在A類對象:如果不存在,則創(chuàng)建一個(gè)A類對象;如果已存在,則直接使用已有的A類對象。當(dāng)一個(gè)類對象用于存儲程序中多個(gè)線程的共享信息時(shí),就要求該類對象只有一份,以避免空間浪費(fèi)以及信息不一致等問題。單例模式在介紹單例模式的具體實(shí)現(xiàn)方式前,先介紹使用類創(chuàng)建對象時(shí)的執(zhí)行過程:當(dāng)使用類創(chuàng)建一個(gè)對象時(shí),使用__init__構(gòu)造方法能夠?qū)ο笾械膶傩宰龀跏蓟僮?。?shí)際上,在執(zhí)行__init__前,還會(huì)執(zhí)行類的一個(gè)內(nèi)置的類方法__new__,其作用是創(chuàng)建對象并返回;而之后執(zhí)行的__init__則負(fù)責(zé)對__new__返回的對象做初始化。單例模式對象名(實(shí)參表)#等價(jià)于對象名.__call__(實(shí)參表)__call__是類的另一個(gè)內(nèi)置方法,通過在一個(gè)類中定義__call__方法,可以支持如下寫法:如果在元類中定義__call__方法,則可以改變類的實(shí)例化過程。單例模式有多種實(shí)現(xiàn)方式,這里介紹一種通過重寫元類的__init__和__call__實(shí)現(xiàn)單例模式的方法。單例模式單例模式【任務(wù)描述】了解單例模式的用法【關(guān)鍵步驟】了解單例模式的用法示例071 classMyMetaclass(type):#以type作為父類創(chuàng)建子類MyMetaclass2 def__new__(cls,*args,**kwargs):3 print('MyMetaclass中的__new__被執(zhí)行!')4 returnsuper().__new__(cls,*args,**kwargs)5 def__init__(self,*args,**kwargs):#定義__init__方法6 print('MyMetaclass中的__init__被執(zhí)行!')7 self._instance=None8 returnsuper().__init__(*args,**kwargs)9 def__call__(self,*args,**kwargs):10 print('MyMetaclass中的__call__被執(zhí)行!')11 ifself._instanceisNone:12 self._instance=super().__call__(*args,**kwargs)13 returnself._instance14 classWebData(metaclass=MyMetaclass):#MyMetaclass作元類定義WebData類15 def__new__(cls,*args,**kwargs):16 print('WebData類中的__new__被執(zhí)行!')17 returnsuper().__new__(cls)18 def__init__(self):19 print('WebData類中的__init__被執(zhí)行!')20 def__call__(self,timeout):21 print('WebData類中的__call__被執(zhí)行!')22 self.timeout=timeout單例模式示例0723 if__name__=='__main__':24 wb1=WebData()#定義WebData類對象wb125 wb2=WebData()#定義WebData類對象wb226 wb1(60)#等價(jià)于wb1.__call__(60)27 print(wb1.timeout)28 wb1.timeout=3029 print(wb1.timeout)30 wb2.timeout=1531 print(wb1.timeout,wb2.timeout)單例模式MyMetaclass中的__new__被執(zhí)行!MyMetaclass中的__init__被執(zhí)行!MyMetaclass中的__call__被執(zhí)行!WebData類中的__new__被執(zhí)行!WebData類中的__init__被執(zhí)行!MyMetaclass中的__call__被執(zhí)行!WebData類中的__call__被執(zhí)行!60301515程序執(zhí)行完畢后,將在屏幕上輸出如下結(jié)果:示例07鴨子類型PART08鴨子類型(DuckTyping)的含義是“當(dāng)看到一只鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那么這只鳥就可以被稱為鴨子”。在鴨子類型中,關(guān)注的不是對象所屬的類,而是一個(gè)對象能夠如何使用。在Python中編寫一個(gè)函數(shù),傳遞實(shí)參前其參數(shù)的類型并不確定,在函數(shù)中使用形參進(jìn)行操作時(shí)只要傳入的對象能夠支持該操作程序就能正常執(zhí)行。鴨子類型鴨子類型【任務(wù)描述】了解鴨子類型的用法【關(guān)鍵步驟】了解鴨子類型的用法示例081 classPerson:#定義Person類2 defCaptureImage(self):#定義CaptureImage方法3 print('Person類中的CaptureImage方法被調(diào)用!')4 classCamera:#定義Camera類5 defCaptureImage(self):#定義CaptureImage方法6 print('Camera類中的CaptureImage方法被調(diào)用!')7 defCaptureImageTest(arg):#定義CaptureImageTest方法8 arg.CaptureImage()#通過arg調(diào)用CaptureImage方法9 if__name__=='__main__':10 p=Person()#定義Person類對象p11 c=Camera()#定義Ca
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度環(huán)保科技公司文員聘用及綠色創(chuàng)新協(xié)議
- 二零二五年度農(nóng)村私人土地租賃與特色養(yǎng)殖合作合同
- 二零二五年度跨境電商金融服務(wù)商務(wù)協(xié)議書
- 小微企業(yè)市場開拓的營銷推廣計(jì)劃
- 電商平臺用戶行為規(guī)范及免責(zé)聲明
- 車位抵押借款合同協(xié)議
- 企業(yè)信息化改造升級合作協(xié)議
- 設(shè)備采購說明文書模板
- 提高團(tuán)隊(duì)協(xié)作效率的行動(dòng)計(jì)劃
- 物流運(yùn)輸安全及免責(zé)承諾書
- (三級)工業(yè)機(jī)器人運(yùn)用與維護(hù)理論考試復(fù)習(xí)題庫(含答案)
- 2024年廣東省公務(wù)員錄用考試《行測》真題及解析
- 高中英語必背3500單詞表(完整版)
- 房產(chǎn)中介居間服務(wù)合同模板樣本
- 海洋工程裝備保險(xiǎn)研究
- 2024年廣東省深圳市中考英語試題含解析
- GB/T 16288-2024塑料制品的標(biāo)志
- 麻風(fēng)病防治知識課件
- 3素炒圓白菜 教案
- 透析患者營養(yǎng)不良護(hù)理
- 學(xué)生消防安全常識問卷及答案
評論
0/150
提交評論