Python閉包及裝飾器運(yùn)行原理解析
一、閉包
閉包從形式上來(lái)說(shuō)是在外部函數(shù)中定義內(nèi)部函數(shù),并且內(nèi)部函數(shù)引用了外部函數(shù)的變量,此變量叫做自由變量。
或者說(shuō)是將組成函數(shù)的語(yǔ)句和這些語(yǔ)句的執(zhí)行環(huán)境打包在一起。
閉包滿足的條件:
必須有一個(gè)內(nèi)嵌函數(shù)
內(nèi)嵌函數(shù)必須使用外部函數(shù)的變量
外部函數(shù)的返回值必須是內(nèi)嵌函數(shù)
def closure(): value = [] def fun(tmp): value.append(tmp) return value return funcc = closure() cc(0) #[0] 等同于closure(fun(0))cc(1) #[0,1]cc(2) #[0,1,2]
外部函數(shù)closure中有變量value和內(nèi)部函數(shù)fun,并且內(nèi)部函數(shù)fun引用了自由變量value,當(dāng)執(zhí)行cc = closure()時(shí),就產(chǎn)生了一個(gè)閉包fun,該閉包持有只有變量value,當(dāng)函數(shù)closure生命周期結(jié)束后,value依然存在,因?yàn)樗婚]包引用了。
二、裝飾器
裝飾器其實(shí)就是閉包的應(yīng)用,只不過(guò)其傳遞的是函數(shù)。
def add_time(fun): def wrapper(): print(’time: 12:00’) return fun() return wrapperdef add_format(fun): def wrapper(): print(’n’) return fun() return wrapper@add_format #等同于demo = add_format(add_time(demo))@add_time #等同于 demo = add_time(demo)def demo(): return ’hello world!’
另外,裝飾器會(huì)將demo函數(shù)的元信息丟失,例如__name__等等。
例如demo函數(shù)的__name__會(huì)由’demo’變成了’wrapper’,這時(shí)需要用到functools庫(kù),在wrapper函數(shù)前加上@functools.wraps(fun):
import functoolsdef add_time(fun): @functools.wraps(fun) def wrapper(): print(’time: 12:00’) return fun() return wrapperdef add_format(fun): @functools.wraps(fun) def wrapper(): print(’n’) return fun() return wrapper@add_format #等同于demo = add_format(add_time(demo))@add_time #等同于 demo = add_time(demo)def demo(): return ’hello world!’
例如給任意函數(shù)加上打印時(shí)間的功能的裝飾器:
def metric(fn): start=time.time() @functools.wraps(fn) def wrapper(*args,**kw): end=time.time() print(’%s executed in %s ms’ % (fn.__name__,start-end)) return fn(*args,**kw) return wrapper
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. 基于javascript處理二進(jìn)制圖片流過(guò)程詳解2. ajax請(qǐng)求添加自定義header參數(shù)代碼3. Gitlab CI-CD自動(dòng)化部署SpringBoot項(xiàng)目的方法步驟4. 教你如何寫(xiě)出可維護(hù)的JS代碼5. ASP中解決“對(duì)象關(guān)閉時(shí),不允許操作。”的詭異問(wèn)題……6. 使用Python和百度語(yǔ)音識(shí)別生成視頻字幕的實(shí)現(xiàn)7. ASP刪除img標(biāo)簽的style屬性只保留src的正則函數(shù)8. Django-migrate報(bào)錯(cuò)問(wèn)題解決方案9. idea刪除項(xiàng)目的操作方法10. html5手機(jī)觸屏touch事件介紹
