裝飾器原理:
????裝飾器是為了在不改變原函數(shù)的功能的同時給原函數(shù)增加一些新功能的函數(shù)叫做裝飾器。
十多年的寧鄉(xiāng)網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都營銷網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整寧鄉(xiāng)建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)從事“寧鄉(xiāng)網(wǎng)站設(shè)計”,“寧鄉(xiāng)網(wǎng)站推廣”以來,每個客戶項目都認(rèn)真落實(shí)執(zhí)行。
首先說一下簡單的裝飾器原理
def?aa(): ????print('我就是一個簡單的函數(shù)')
我們?nèi)绻俨桓淖冞@個函數(shù)的基礎(chǔ)上添加一個新功能該怎么做?
我們只需要添加一個新函數(shù)來調(diào)用這個函數(shù),然后在形函數(shù)上添加新功能就好了,例如
def?decorate(fn): ????def?inner(): ????????print('這個是新加功能') ????????return?fn ????return?inner() def?aa(): ????print('我就是一個簡單的函數(shù)') aa?=?decorate(aa) aa()
輸出結(jié)果為:
這個是新加功能 我就是一個簡單的函數(shù)
下面就看看更詳細(xì)一點(diǎn)的裝飾器
直接上代碼,查看結(jié)果
def?decorate(func): ????def?inner(a,b): ????????print('3?給函數(shù)添加一個求和的輸出?{}?{}'.format(a,b)) ????????print('4?我要打印func函數(shù)',?func) ????????result?=?func(a,b) ????????print('6?我要打印add函數(shù)',?add) ????????print('7?我要打印func函數(shù)',?func) ????????print('8?我要打印inner函數(shù)',?inner) ????????return?result ????print('2?我要打印decorate函數(shù)',decorate) ????return?inner @decorate def?add(a,b): ????print('5?我要打印add函數(shù)',?add) ????return?a+b print('1?我應(yīng)該是首個打印的') print('9?這是函數(shù)輸出的結(jié)果',add(1,2))
輸出結(jié)果為:
2?我要打印decorate函數(shù)?decorate 1?我應(yīng)該是首個打印的 3?給函數(shù)添加一個求和的輸出?1?2 4?我要打印func函數(shù)?add 5?我要打印add函數(shù)?inner 6?我要打印add函數(shù)?inner 7?我要打印func函數(shù)?add 8?我要打印inner函數(shù)?inner 2?我要打印decorate函數(shù)?decorate 9?這是函數(shù)輸出的結(jié)果?3
過程分析
由上面的輸出,我們可以看得出來,裝飾器的執(zhí)行順序是,213456789;
那是因為@裝飾器函數(shù),然后相當(dāng)于把函數(shù)add傳給了裝飾器,從而變成了add = decorate(add),這里調(diào)用了decorate函數(shù)把函數(shù)add傳到了
裝飾器內(nèi)部,然后就打印了第二步,由于沒有后續(xù)的調(diào)用,程序就在這里在inner處停滯等待被調(diào)用,而inner的實(shí)際指針已經(jīng)指向了add函數(shù)
所以打我們打印func的時候輸出的是add函數(shù),并沒有帶locals,這里就不屬于decorate的內(nèi)部函數(shù),而我們裝飾器下面的add函數(shù)卻已經(jīng)成
為了inner的內(nèi)部函數(shù)了,接下來的邏輯就是正常的函數(shù)執(zhí)行邏輯了
#裝飾器過程
@decorare+add --》decorate--》inner--》result=func 即 result=add--》
#調(diào)用過程
(新add)add(1,2)--》result(1,2)--》(被裝飾函數(shù)add)add(1,2)--》輸出結(jié)果
但是經(jīng)過了裝飾器這兩個add只是同名而已