版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
筐魚梧領(lǐng)鳳峽匪跑腳凡輔乒蹤勿久褂舟嬰襲剪肚爹倫甄嘯鐐娟附卉態(tài)再罵廣東農(nóng)工商職業(yè)技術(shù)學(xué)院PPT模板-精美原創(chuàng)畢業(yè)論文答辯廣東農(nóng)工商職業(yè)技術(shù)學(xué)院PPT模板-精美原創(chuàng)畢業(yè)論文答辯項(xiàng)目10類與對(duì)象高級(jí)應(yīng)用目錄|CONTENT1項(xiàng)目介紹2項(xiàng)目目標(biāo)3項(xiàng)目準(zhǔn)備4項(xiàng)目實(shí)施項(xiàng)目介紹項(xiàng)目背景本項(xiàng)目在前兩個(gè)項(xiàng)目的基礎(chǔ)上,介紹Python類中所提供的高級(jí)面向?qū)ο笤O(shè)計(jì)方法。這些方法能在類設(shè)計(jì)、編碼效率和程序執(zhí)行效率等方面提供更好的實(shí)現(xiàn)方法。項(xiàng)目介紹項(xiàng)目規(guī)劃01熟悉類方法、靜態(tài)方法等類設(shè)計(jì)的高級(jí)方法02了解動(dòng)態(tài)擴(kuò)展類、__slot__、@property、元類(metaclass)等概念和使用方法03能使用上述方法運(yùn)解決相關(guān)問題目錄|CONTENT1項(xiàng)目介紹2項(xiàng)目目標(biāo)3項(xiàng)目準(zhǔn)備4項(xiàng)目實(shí)施項(xiàng)目目標(biāo)知識(shí)目標(biāo)1熟悉類方法、靜態(tài)方法的概念2解動(dòng)態(tài)擴(kuò)展類、__slot__、@property、元類(metaclass)、鴨子類型等概念3了解Python類設(shè)計(jì)的性能的相關(guān)概念項(xiàng)目目標(biāo)能力目標(biāo)1熟練運(yùn)用類方法、靜態(tài)方法2會(huì)運(yùn)用動(dòng)態(tài)擴(kuò)展類、__slot__、@property、元類(metaclass)、鴨子類型等方法3能運(yùn)用Python類的一些高級(jí)方法進(jìn)行類的設(shè)計(jì)目錄|CONTENT1項(xiàng)目介紹2項(xiàng)目目標(biāo)3項(xiàng)目準(zhǔn)備4項(xiàng)目實(shí)施項(xiàng)目準(zhǔn)備1.靜態(tài)方法靜態(tài)方法的定義之前需要添加“@staticmethod”。靜態(tài)方法定義時(shí),不需要表示訪問對(duì)象的self參數(shù),形式上與普通函數(shù)的定義類似。靜態(tài)方法只能訪問屬于類的成員,不能訪問屬于對(duì)象的成員。一個(gè)類的所有實(shí)例對(duì)象共享靜態(tài)方法。使用靜態(tài)方法時(shí),既可以通過“對(duì)象名.靜態(tài)方法名”來訪問,也可以通過“類名.靜態(tài)方法名”來訪問。項(xiàng)目準(zhǔn)備1.靜態(tài)方法classPerson:number=0def__init__(self,name):=namePerson.number+=1defgetName(self):print('Mynameis',)
@staticmethod#聲明靜態(tài),去掉則編譯報(bào)錯(cuò)defgetNumber():#靜態(tài)方法沒有selfprint("總?cè)藬?shù)為:",Person.number)
#主程序p_lily=Person("Lily")p_lily.getName()p_lily.getNumber()Person.getNumber()p_david=Person('David')p_david.getName()p_david.getNumber()Person.getNumber()p_lily.getNumber()MynameisLily總?cè)藬?shù)為:1總?cè)藬?shù)為:1MynameisDavid總?cè)藬?shù)為:2總?cè)藬?shù)為:2總?cè)藬?shù)為:2項(xiàng)目準(zhǔn)備2.類方法方法定義之前由“@classmethod”語句引導(dǎo),第一個(gè)形參通常被命名為cls。類方法既可以通過類名,也可以通過對(duì)象名來調(diào)用。項(xiàng)目準(zhǔn)備2.類方法classPerson(object):__number=0def__init__(self):Person.__number+=1
@classmethoddefgetNumber(cls):returncls.__number
classTeacher(Person):def__init__(self,name):=namesuper().__init__()
#主程序t_mike=Teacher('Mike')print(t_mike.getNumber())print(Person.getNumber())t_lucy=Teacher("Lucy")print(t_lucy.getNumber())print(Person.getNumber())print(t_mike.getNumber())11222項(xiàng)目準(zhǔn)備3.動(dòng)態(tài)擴(kuò)展類Python作為一種動(dòng)態(tài)語言,除了可以在定義類時(shí)定義屬性和方法外,還可以動(dòng)態(tài)地為已經(jīng)創(chuàng)建的對(duì)象綁定新的屬性和方法。項(xiàng)目準(zhǔn)備3.動(dòng)態(tài)擴(kuò)展類fromtypesimportMethodType#從types模塊中導(dǎo)入MethodType方法
classStudent:#定義學(xué)生類,沒有定義任何方法 pass
defSetName(self,name):#定義SetName函數(shù)=namedefSetSno(self,sno):#定義SetSno函數(shù)self.sno=sno
if__name__=='__main__':stu1=Student()#定義Student類實(shí)例stu1 stu2=Student()#定義Student類實(shí)例stu2 stu1.SetName=MethodType(SetName,stu1)#為stu1對(duì)象綁定SetName方法 Student.SetSno=SetSno#為Student類綁定SetSno方法 stu1.SetName('李曉明') stu1.SetSno('1810100') #stu2.SetName('張剛')#由于SetName只是綁定給了實(shí)例stu1,所以stu2實(shí)例無法使用該方法 stu2.SetSno('1810101')
通過方法MethodType()將方法SetName綁定給了實(shí)例stu1。通過語句Student.SetSno=SetSno將方法SetSno()綁定給了類Student,從而實(shí)現(xiàn)了類的動(dòng)態(tài)擴(kuò)展。動(dòng)態(tài)綁定雖然增加了類定義的靈活性,但是也破壞了面向?qū)ο蟮姆庋b性原則,在實(shí)際中一般不建議使用。項(xiàng)目準(zhǔn)備4.__slot__屬性Python在類中定義__slot__屬性來限制實(shí)例的屬性字段,在創(chuàng)建大量對(duì)象的場(chǎng)合可以減少內(nèi)存占用。正如slot單詞的含義,槽,相當(dāng)于在類的設(shè)計(jì)中預(yù)留好了固定的槽。__slot__限制了屬性值,添加__slot__元組之外的屬性會(huì)報(bào)錯(cuò)。__slot__限制的是實(shí)例屬性的添加,不限制類屬性的添加。classPerson:#定義Person類__slots__=('name')#定義允許動(dòng)態(tài)擴(kuò)展的屬性
classStudent(Person):#以Person類作為父類定義子類Student類__slots__=('sno')#定義允許動(dòng)態(tài)擴(kuò)展的屬性classPostgraduate(Student):#以Student類作為父類定義子類Postgraduate類pass
if__name__=='__main__':stu=Student()#定義Student類對(duì)象stustu.sno='1810100'#為stu對(duì)象動(dòng)態(tài)擴(kuò)展屬性sno='李曉明'#為stu對(duì)象動(dòng)態(tài)擴(kuò)展屬性name#stu.tutor='馬紅'#擴(kuò)展tutor屬性,在__slots__中并未定義,所以報(bào)錯(cuò)pg=Postgraduate()#定義Postgraduate類對(duì)象pgpg.sno='1810101'#為pg對(duì)象動(dòng)態(tài)擴(kuò)展屬性sno='張剛'#為pg對(duì)象動(dòng)態(tài)擴(kuò)展屬性namepg.tutor='馬紅'#為pg對(duì)象動(dòng)態(tài)擴(kuò)展屬性tutor項(xiàng)目準(zhǔn)備5.@property裝飾器和@setter裝飾器@property裝飾器,可以將類中屬性的訪問和賦值操作自動(dòng)轉(zhuǎn)為方法調(diào)用,這樣可以在方法中對(duì)屬性值的取值范圍做一些條件限定。如果類中只對(duì)屬性使用了@property,則對(duì)應(yīng)屬性會(huì)變?yōu)橹蛔x,無法更改屬性值。項(xiàng)目準(zhǔn)備5.@property裝飾器和@setter裝飾器為了能夠修改@property修飾的屬性,需要為屬性添加setter方法,就需要用到setter裝飾器,其語法為:@方法名.setterdef方法名(self,value):代碼塊項(xiàng)目準(zhǔn)備6.元類(metaclass)所有的對(duì)象都是實(shí)例化或者說是通過調(diào)用類而得到的,python中一切皆對(duì)象,通過class關(guān)鍵字定義的類本質(zhì)也是對(duì)象,對(duì)象又是通過調(diào)用類得到的,因此通過class關(guān)鍵字定義的類肯定也是調(diào)用了一個(gè)類得到的,這個(gè)類就是元類。元類就是用來實(shí)例化產(chǎn)生類的類。項(xiàng)目準(zhǔn)備6.元類(metaclass)classStudent:#定義Student類pass
stu=Student()#定義Student類的對(duì)象stuprint('stu所屬的類是:',stu.__class__)#使用__class__屬性獲取所屬的類print('Student所屬的類是:',Student.__class__)stu所屬的類是:<class'__main__.Student'>Student所屬的類是:<class'type'>項(xiàng)目準(zhǔn)備7.單例模式(SingletonPattern)單例模式(SingletonPattern)是指在程序運(yùn)行時(shí)確保某個(gè)類最多只有一個(gè)實(shí)例對(duì)象。例如A類采用單例模式,則當(dāng)創(chuàng)建A類對(duì)象時(shí)需要判斷是否已存在A類對(duì)象:如果不存在,則創(chuàng)建一個(gè)A類對(duì)象;如果已存在,則直接使用已有的A類對(duì)象。項(xiàng)目準(zhǔn)備7.單例模式(SingletonPattern)當(dāng)一個(gè)類對(duì)象用于存儲(chǔ)程序中多個(gè)線程的共享信息時(shí),就要求該類對(duì)象只有一份,以避免空間浪費(fèi)以及信息不一致等問題。__call__是Python類的一個(gè)內(nèi)置方法,能夠讓類的實(shí)例對(duì)象,像函數(shù)一樣被調(diào)用。一個(gè)類實(shí)例要變成一個(gè)可調(diào)用對(duì)象,只需要實(shí)現(xiàn)一個(gè)特殊方法__call__()項(xiàng)目準(zhǔn)備7.單例模式(SingletonPattern)classMyMetaclass(type):#以type作為父類創(chuàng)建子類MyMetaclassdef__new__(cls,*args,**kwargs):print('MyMetaclass中的__new__被執(zhí)行!')returnsuper().__new__(cls,*args,**kwargs)def__init__(self,*args,**kwargs):#定義__init__方法print('MyMetaclass中的__init__被執(zhí)行!')self._instance=Nonereturnsuper().__init__(*args,**kwargs)def__call__(self,*args,**kwargs):print('MyMetaclass中的__call__被執(zhí)行!')ifself._instanceisNone:self._instance=super().__call__(*args,**kwargs)returnself._instanceclassWebData(metaclass=MyMetaclass):#MyMetaclass作元類定義WebData類def__new__(cls,*args,**kwargs):print('WebData類中的__new__被執(zhí)行!')returnsuper().__new__(cls)def__init__(self):print('WebData類中的__init__被執(zhí)行!')def__call__(self,timeout):print('WebData類中的__call__被執(zhí)行!')self.timeout=timeout
if__name__=='__main__':wb1=WebData()#定義WebData類對(duì)象wb1wb2=WebData()#定義WebData類對(duì)象wb2wb1(60)#等價(jià)于wb1.__call__(60)print(wb1.timeout)wb1.timeout=30print(wb1.timeout)wb2.timeout=15print(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項(xiàng)目準(zhǔn)備8.鴨子類型(DuckTyping)鴨子類型(DuckTyping)的含義是“當(dāng)看到一只鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那么這只鳥就可以被稱為鴨子”。在鴨子類型中,關(guān)注的不是對(duì)象所屬的類,而是一個(gè)對(duì)象能夠如何使用。在Python中編寫一個(gè)函數(shù),傳遞實(shí)參前其參數(shù)的類型并不確定,在函數(shù)中使用形參進(jìn)行操作時(shí)只要傳入的對(duì)象能夠支持該操作程序就能正常執(zhí)行。項(xiàng)目準(zhǔn)備8.鴨子類型(DuckTyping)classPerson:#定義Person類defCaptureImage(self):#定義CaptureImage方法print('Person類中的CaptureImage方法被調(diào)用!')
classCamera:#定義Camera類defCaptureImage(self):#定義CaptureImage方法print('Camera類中的CaptureImage方法被調(diào)用!')
defCaptureImageTest(arg):#定義CaptureImageTest方法arg.CaptureImage()#通過arg調(diào)用CaptureImage方法
if__name__=='__main__':p=Person()#定義Person類對(duì)象pc=Camera()#定義Camera類對(duì)象cCaptureImageTest(p)CaptureImageTest(c)Person類中的CaptureImage方法被調(diào)用!Camera類中的CaptureImage方法被調(diào)用!目錄|CONTENT1項(xiàng)目介紹2項(xiàng)目目標(biāo)3項(xiàng)目準(zhǔn)備4項(xiàng)目實(shí)施項(xiàng)目實(shí)施任務(wù)10.1getter、setter、deleter方法與裝飾器數(shù)據(jù)封裝、繼承和多態(tài)只是面向?qū)ο蟪绦蛟O(shè)計(jì)中最基礎(chǔ)的3個(gè)概念。在Python中,面向?qū)ο筮€有很多高級(jí)特性。在綁定屬性時(shí),如果我們直接把屬性暴露出去,雖然寫起來很簡(jiǎn)單,但是,沒辦法檢查參數(shù),導(dǎo)致可以把成績(jī)隨便改。Python內(nèi)置的@property裝飾器可以把一個(gè)方法變成屬性調(diào)用。本任務(wù)要求定義一個(gè)Person類,包含屬性first_name。定義該屬性的setter、getter與deleter方法,使得通過Person類實(shí)例訪問first_name屬性時(shí),能夠自動(dòng)調(diào)用相應(yīng)方法。項(xiàng)目實(shí)施任務(wù)10.1getter、setter、deleter方法與裝飾器建立“getter、setter、deleter.py”文件,用于編寫Python實(shí)驗(yàn)程序編寫任務(wù)代碼#定義一個(gè)Person類,該類有一個(gè)first_name屬性classPerson:def__init__(self,first_name):self.first_name=first_name
@property#定義first_name屬性的getter方法deffirst_name(self):print('getter')returnself._first_name
@first_name.setter#定義first_name屬性的setter方法deffirst_name(self,value):print('setter')ifnotisinstance(value,str):print('請(qǐng)輸入正確的名字')self._first_name=value
@first_name.deleter#定義first_name屬性的deleter方法deffirst_name(self):print('deleter')
#創(chuàng)建Person類的實(shí)例,并調(diào)用相應(yīng)的方法if__name__=='__main__':person=Person('Tom')print(person.first_name)person.first_name='Jerry'delperson.first_name項(xiàng)目實(shí)施任務(wù)10.1getter、setter、deleter方法與裝飾器執(zhí)行程序①用鼠標(biāo)右鍵單擊右側(cè)編輯窗口,在菜單中選擇“Run‘python主程序所在文件名’”一項(xiàng)執(zhí)行編寫好的Python程序,本次實(shí)驗(yàn)文件名為“getter、setter、deleter”②在IDE下方控制臺(tái)查看輸出結(jié)果課后練習(xí)與技能訓(xùn)練一、填空題練習(xí)1.Python提供了
變量以限制可動(dòng)態(tài)擴(kuò)展的屬性。2.Python提供了
裝飾器,可以將類中屬性的訪問和賦值操作自動(dòng)轉(zhuǎn)為方法調(diào)用,這樣可以在方法中對(duì)屬性值的取值范圍做一些條件限定。3.直接使用@property可以定義一個(gè)用于獲取屬性值的方法(即getter)。如果需要對(duì)屬性score定義一個(gè)設(shè)置屬性值的方法(setter),需要用到的裝飾器為
。課后練習(xí)與技能訓(xùn)練一、填空題練習(xí)4.
可以看成是創(chuàng)建類時(shí)所使用的模板,也可以理解為是用于創(chuàng)建類的類。5.
是指在程序運(yùn)行時(shí)確保某個(gè)類最多只有一個(gè)實(shí)例對(duì)象。6.在執(zhí)行__init__前,還會(huì)執(zhí)行類的一個(gè)內(nèi)置的類方法
,其作用是創(chuàng)建對(duì)象并返回。課后練習(xí)與技能訓(xùn)練二、選擇題練習(xí)1.關(guān)于類方法的說法錯(cuò)誤的是()類方法是指使用@classmethod修飾的方法類方法的第一個(gè)參數(shù)是類本身(而不是類的實(shí)例對(duì)象)類方法既可以通過類名直接調(diào)用,也可以通過類的實(shí)例對(duì)象調(diào)用。類方法只能通過類名直接調(diào)用課后練習(xí)與技能訓(xùn)練二、選擇題練習(xí)2.關(guān)于靜態(tài)方法的說法錯(cuò)誤的是()靜態(tài)方法是指使用@staticmethod修飾的方法靜態(tài)方法的第一個(gè)參數(shù)是類本身(而不是類的實(shí)例對(duì)象)靜態(tài)方法既可以通過類名直接調(diào)用,也可以通過類的實(shí)例對(duì)象調(diào)用。靜態(tài)方法中沒有類方法中的第一個(gè)類參數(shù)課后練習(xí)與技能訓(xùn)練二、選擇題練習(xí)3.已知Complex類的類方法add(cls,c1,c2)實(shí)現(xiàn)兩個(gè)復(fù)數(shù)的相加運(yùn)算,程序可以使用不同的方式調(diào)用該方法,下面錯(cuò)誤的調(diào)用方式是()A.c3=Complex.add(c1,c2)B.c3=c1.add(c1,c2)C.c3.add(Complex,c1,c2)D.c3=Complex().add(c1,c2)課后練習(xí)與技能訓(xùn)練二、選擇題練習(xí)4.關(guān)于動(dòng)態(tài)擴(kuò)展類的說
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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年度新材料研發(fā)與產(chǎn)業(yè)化推廣合同3篇
- 2025年度智能車庫(kù)租賃定金合同4篇
- 2024濕地公園生態(tài)教育展示中心建設(shè)合同3篇
- 2024投標(biāo)聯(lián)合體協(xié)議書模板:新型城鎮(zhèn)化項(xiàng)目合作3篇
- 2025個(gè)人股份代持協(xié)議范本與合同履行評(píng)估報(bào)告4篇
- 2025年度金融產(chǎn)品個(gè)人居間推廣合同4篇
- 2025年度個(gè)人股份代持協(xié)議書(藝術(shù)品投資合作)4篇
- 2025年浙江湖州供銷集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 2025年山東玻纖集團(tuán)股份有限公司招聘筆試參考題庫(kù)含答案解析
- 2025年廣西防城港市港發(fā)控股集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 2024年工程咨詢服務(wù)承諾書
- 青桔單車保險(xiǎn)合同條例
- 車輛使用不過戶免責(zé)協(xié)議書范文范本
- 《獅子王》電影賞析
- 2023-2024學(xué)年天津市部分區(qū)九年級(jí)(上)期末物理試卷
- DB13-T 5673-2023 公路自愈合瀝青混合料薄層超薄層罩面施工技術(shù)規(guī)范
- 河北省保定市定州市2025屆高二數(shù)學(xué)第一學(xué)期期末監(jiān)測(cè)試題含解析
- 哈爾濱研學(xué)旅行課程設(shè)計(jì)
- 2024 smart汽車品牌用戶社區(qū)運(yùn)營(yíng)全案
- 中醫(yī)護(hù)理人文
- 2024-2030年中國(guó)路亞用品市場(chǎng)銷售模式與競(jìng)爭(zhēng)前景分析報(bào)告
評(píng)論
0/150
提交評(píng)論