描述器和裝飾_第1頁
描述器和裝飾_第2頁
描述器和裝飾_第3頁
描述器和裝飾_第4頁
描述器和裝飾_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余28頁可下載查看

付費(fèi)下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

Python基礎(chǔ)課教室講師:無名時(shí)間:2018年5月教學(xué)監(jiān)督熱線教學(xué)監(jiān)督熱線01020304必須掌握:繼承,多繼承及super的用法必須掌握:__str____repr____call__方法了解:多繼承方法解析順序和Mix-in開發(fā)模式了解:魔術(shù)方法原理和作用知識(shí)點(diǎn)回顧本節(jié)知識(shí)點(diǎn)01.__new__方法02.定制屬性訪問03.描述符教學(xué)監(jiān)督熱線04.裝飾器第一部分__new__方法教學(xué)監(jiān)督熱線思考01類每次實(shí)例化的時(shí)候都會(huì)創(chuàng)建一個(gè)新的對(duì)象,如果要求類只能被實(shí)例化一次該怎么做呢?02我們創(chuàng)建實(shí)例是通過什么方法創(chuàng)建的呢?在上面的例子中,我們可以看到創(chuàng)建實(shí)例的時(shí)候,自動(dòng)調(diào)用了__new__,方法和__init__方法,并且是先調(diào)用的__new__再調(diào)用的__init__方法,打印cls的時(shí)候顯示的這個(gè)Base類__new__方法1、__new__方法是在類創(chuàng)建實(shí)例的時(shí)候自動(dòng)調(diào)用的。3、先調(diào)用__new__方法創(chuàng)建實(shí)例,再調(diào)用

__init__方法初始化實(shí)例。2、實(shí)例是通過類里面的__new__方法是在

類創(chuàng)建出來的。4、__new__方法,后面括號(hào)里的cls代表的是類本身四個(gè)點(diǎn)理解__new__方法單例模式在上面的例子中,我們可以看到兩個(gè)實(shí)例的ID是相同的,意味著第二次創(chuàng)建的時(shí)候,并沒有真正的去創(chuàng)建,而是引用的第一次創(chuàng)的實(shí)例,只是同一個(gè)實(shí)例的不同名字定義一個(gè)私有屬性__instance等于None然后我們判斷它是不是等于None,如果等于None,我們調(diào)用父類的方法創(chuàng)建一個(gè)實(shí)例對(duì)象,并把返回的對(duì)象賦值給__instance,并且返回__instance

如果__instance不等于None,那就說明已經(jīng)創(chuàng)建了對(duì)象我們直接把__instance返回出去。單例模式實(shí)現(xiàn)的原理:通過重寫__new__方法,讓__new__只能進(jìn)行一次實(shí)例創(chuàng)建。__new__方法初始化函數(shù)之前單例模式合理利用__new__方法合理利用可以帶來方便,常應(yīng)用在類的單例模式利用這個(gè)__new__可以很方便的實(shí)現(xiàn)類的單例模式__new__方法會(huì)在初始化函數(shù)__init__之前執(zhí)行__new__方法總結(jié)必須掌握:__new__方法的運(yùn)行順序了解:使用__new__方法的單例模式應(yīng)用第二部分定制屬性訪問教學(xué)監(jiān)督熱線思考010203如何判斷一個(gè)實(shí)例里面有某個(gè)屬性呢?怎樣刪除實(shí)例屬性呢?同樣的怎樣刪除變量呢?定制屬性訪問030402re=Rectangle(3,4)#矩形類實(shí)例改:setattr(b,'length',6)b.__setattr__('length',5)增:b.aaa=1setattr(b,'bbb',2)#有bbb屬性就改,沒有就增b.__setattr__('ccc',3)#同上刪:delattr(b,'ccc')b.__delattr__('bbb')delb01查:hasattr(re,'length') #返回bool值getattr(re,'length') #返回屬性值b.__getattribute__('length')#返回屬性值getattr(object,

’name’[,

default])hasattr(object,

’name’)setattr(object,

’name’,

value)=valuedelattr(object,

’name’)getattr/

hasattr/setattr/delattrdefhasattr(object,name_string):

try:

getattr(object,name_string)returnTrue

except

AttributeError:returnFalse定制屬性訪問re=Rectangle(3,4)#矩形類實(shí)例getattr(re,'aaa')aaa屬性不存在時(shí),如果定義了此方法,則調(diào)用方法01def__getattr__(self,item):

print('NoThisAttribute')定制屬性訪問b.lengthb.__getattr__('length')屬性值存在屬性值不存在返回屬性值調(diào)用__getattr__未定義時(shí)報(bào)錯(cuò)定制屬性訪問hasattrgetattrsetattr設(shè)置屬性得到屬性值判斷是否存在屬性,如果屬性存在則進(jìn)行下一步操作定制屬性訪問總結(jié)必須掌握:hasattrgetattrsetattr了解:__getattribute__熟悉:

屬性調(diào)用規(guī)則第三部分描述符教學(xué)監(jiān)督熱線思考01如果在一個(gè)類中實(shí)例化另一個(gè)類,對(duì)這個(gè)屬性進(jìn)行訪問的時(shí)候怎么做的?描述符比較抽象的一個(gè)概念,大家了解即可描述符協(xié)議:python描述符是一個(gè)“綁定行為”的對(duì)象屬性,在描述符協(xié)議中,它可以通過方法重寫屬性的訪問。這些方法有__get__(),__set__(),和__delete__()。如果這些方法中的任何一個(gè)被定義在一個(gè)對(duì)象中,這個(gè)對(duì)象就是一個(gè)描述符魔術(shù)方法描述符大家了解即可魔術(shù)方法的作用其實(shí)是讓開發(fā)人員能夠更加靈活的控制類的表現(xiàn)形式描述符總結(jié)了解描述符即可第四部分裝飾器教學(xué)監(jiān)督熱線思考01之前我們講了閉包,閉包中可以傳入一個(gè)函數(shù)嗎?裝飾器能夠?qū)崿F(xiàn)在不修改原來的函數(shù)的基礎(chǔ)上添加功能。python自帶的三個(gè)內(nèi)置裝飾器classRectangle:

def__init__(self,length,width):

self.length=length

self.width=width

defarea(self):

areas=self.length*self.width

returnareas

@property #就像訪問屬性一樣

defarea(self):

returnself.width*self.length

@staticmethod #靜態(tài)方法

deffunc(): #self在調(diào)用的時(shí)候會(huì)報(bào)錯(cuò)

print('staticmethodfunc')

@classmethod #類方法

defshow(cls): #cls代表類本身如果加上self,在調(diào)用時(shí)就要把實(shí)例傳入

print(cls)

print('showfun')類裝飾器classTest_Class:

def__init__(self,func):

self.func=func

def__call__(self):

print('類')

returnself.func

@Test_Class

deffun_test():

print('這是個(gè)測試函數(shù)')類也可以做裝飾器,但是需要定義__call__方法裝飾器參考查看函數(shù)運(yùn)行時(shí)間:importtime

defrun_time(func):

defnew_fun(*args,**kwargs):

t0=time.time()

print('startime:%s'%(time.strftime('%x',time.localtime())))

back=func(*args,**kwargs)

print('endtime:%s'%(time.strftime('%x',time.localtime())))

print('runtime:%s'%(time.time()-t0))

returnback

returnnew_fun裝飾器修飾函數(shù)增加功能內(nèi)置裝飾器三個(gè)內(nèi)置裝飾器是需要掌握的,在項(xiàng)目中會(huì)經(jīng)常使用給函數(shù)增加功能修飾函數(shù)裝飾器總結(jié)必須掌握:裝飾器概念和用法必須掌握:三個(gè)內(nèi)置裝飾器的用法本節(jié)知識(shí)點(diǎn)回顧必須掌握:__n

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論