如果一個函數(shù)定義在另外一個函數(shù)的作用域中,并且函數(shù)中引用了外部函數(shù)的局部變量然爆,那么這個函數(shù)就是一個閉包站粟。
1、先介紹一下python局部變量和全局變量
局部變量一般指的是函數(shù)內(nèi)部定義的變量施蜜,局部變量生命周期與定義的函數(shù)一致卒蘸。函數(shù)調(diào)用完成后,局部變量的工作空間也會被銷毀
全局變量指的是函數(shù)外定義的變量,內(nèi)存空間是全局的缸沃。在任意地方都可以調(diào)用
2恰起、介紹一下python的嵌套函數(shù)
簡單來說就是在函數(shù)A內(nèi)部再定義一個函數(shù)B,然后再函數(shù)A函數(shù)體內(nèi)再調(diào)用函數(shù)B趾牧。套路就是這樣
3检盼、在函數(shù)外是無法調(diào)用函數(shù)內(nèi)的局部變量的,而閉包就是用來解決這種情況的翘单。閉包指的是函數(shù)嵌套函數(shù)吨枉,但是內(nèi)函數(shù)會調(diào)用外函數(shù)的局部變量或者參數(shù)。導(dǎo)致外函數(shù)調(diào)用完內(nèi)函數(shù)后哄芜,參數(shù)和變量不會被垃圾回收機制回收貌亭。
裝飾器函數(shù)主要作用是不影響原有函數(shù)的功能,在函數(shù)前后增加新的功能认臊。比如日志打印功能圃庭、計算時間
裝飾器不影響原有函數(shù)功能,即需要在函數(shù)執(zhí)行之前或者函數(shù)執(zhí)行之后進(jìn)行操作失晴。比如說計算函數(shù)運行時間的代碼剧腻,我們需要在函數(shù)執(zhí)行之前開始計時,函數(shù)執(zhí)行后再統(tǒng)計時間涂屁。定義一個函數(shù)书在,代碼邏輯是,需要傳入?yún)?shù)拆又,這個參數(shù)即是功能函數(shù)儒旬。
定義的裝飾器函數(shù)有內(nèi)函數(shù)和外函數(shù)組成
外函數(shù)接受一個參數(shù),參數(shù)為要裝飾的功能函數(shù)遏乔。外函數(shù)的返回值為內(nèi)函數(shù)【不是調(diào)用】
內(nèi)函數(shù)接受裝飾的功能函數(shù)的參數(shù)
執(zhí)行過程是
aaaa=test(aaaa)? ?返回內(nèi)函數(shù)inner_fun
aaaa(1,2,3,age=10,gender=1)? ? 即執(zhí)行inner_fun(1,2,3,age=10,gender=1)
為什么說裝飾器是閉包呢义矛,因為內(nèi)函數(shù)inner_fun調(diào)用了函數(shù)外的參數(shù)aaaa。而函數(shù)外aaaa指向內(nèi)函數(shù)inner_fun盟萨。