1 閉包:首先從結構上說,必須是嵌套函數,內部函數必須用到外層函數的參數,外層函數的返回值必須是內層函數的引用.
其次,本質上是數據和功能的結合.數據就是由外層函數提供,功能由內層函數實現.類似於定義了一個類.
def out_func(*args): def inner_func(): #實現功能的區域 print(args) return inner_func
2裝飾器:本質上是引用的重定向.基於python中一切皆對象.踐行的原則是:開放封閉原則(也就是已經實現功能的代碼,是封閉的不允許隨意改動,可以擴展開發,增加功能.)
要求:裝飾器函數其實是這樣一個接口約束,它必須接受一個callable對象作爲參數,然後返回一個callable對象。
2.1 裝飾器一般是由閉包實現的.簡單結構如下
def out_func(func): def inner_func(): #裝飾代碼 print("執行裝飾代碼") return func() return inner_func #進行裝飾 @out_func #相當於 調用 test_decorator=out_func(test_decorator) def test_decorator(): print("這是測試..........") test_decorator()
2.2 通用裝飾器
import functools def log(*ar,**kw): def decorator(func): @functools.wraps(func) def wrapper(*args,**kw): print("%s (%s)"%(text,func.__name__)) return func(*args,**kw) return wrapper return decorator @log("args")#相當於先執行log函數,然後用decorator函數進行裝飾. def now(): print("----------------") now()
2.3 裝飾器也可以由類來實現.
class Test(): def __init__(self,func): self.func=func def __call__(self,*args,**kw): return self.func(*args,**kw) @Test def my_log(*args,**kwargs): #具體業務邏輯 pass
2.3 裝飾器的應用場景:一般主要用於給已經有的函數增加一些功能但是又不用改變已有的函數.經常用於有切面需求的場景,
引入日誌
函數執行時間統計
執行函數前預備處理
執行函數後清理功能
權限校驗等場景
緩存.
達到抽離出大量與函數功能無關的雷同代碼並繼續重用.
2.4 裝飾器可以多層裝飾,裝飾順序從內到外裝飾,調用執行順序是從外向內執行.