高階函數:至少滿足下面兩個條件中的一個
1:接受一個或多個函數為參數
2:輸出一個函數
柯里化:將原來接受兩個參數的函數變成新的接受一個參數的函數的過程。新的函數返回一個以原來第二個參數為參數的函數。z=f(x,y)—>z=f(x)(y)
裝飾器(無參)
1:是一個函數
2:函數作為它的形參
3:返回值也是一個函數
4:可以使用@functionname方式調用
裝飾器是對傳入函數的功能的裝飾(功能增強)
裝飾器的基本形式:
def logger(fn):
def wrapper(*args,**kwargs):
ret=fn(*args,**kwargs)
return ret
return warp
@logger
def add(x,y):
return x+y
logger函數為裝飾器函數,對add函數進行功能性的增強。
@functionname下緊跟著的為被裝飾的函數。
裝飾器會替換掉原函數對象的屬性,需要使用一個functools模塊進行保護。
用上面的例子
from functools import wraps
def logger(fn):
@wraps(fn)
def wrapper(*args,**kwargs):
ret=fn(*args,**kwargs)
return ret
return warpper
@logger
def add(x,y):
return x+y
帶參裝飾器:
1:是一個函數
2:函數作為它的形參
3:返回值是一個不帶參的裝飾器函數
4:使用@functionname(參數列表)方式調用
5:可以看做在裝飾器外層又加了一層函數
from functools import wraps
def logger(f):
def _logger(fn):
@wraps(fn)
def wrapper(*args,**kwargs):
ret=fn(*args,**kwargs)
return ret
return warpper
return _logger
@logger
def add(x,y):
return x+y
裝飾器的用途:
裝飾器是AOP(Aspect Orientend Programming)面向切面編程的思想體現。
面向對象往往需要通過繼承或者組合依賴等方式調用一些功能,這些功能的代碼往往可能在多個類中出現,例如logger,這樣造成代碼的重復,增加了耦合。logger的改變影響所有使用它的類或方法。而AOP在需要的類或方法上切下,前后的切入點可以加入增強的功能。讓調用者和被調用者解耦。這是一種不修改原來的業務代碼,給程序動態添加功能的技術。例如logger函數功能就是對業務函數增加日志的,而業務函數中應該把與業務無關的日志功能剝離干凈。
裝飾器的應用場景:
日志、監控、權限、設計、參數檢查、路由等處理。
這些功能與業務功能無關,很多業務都需的公共功能,適合獨立出來,需要時對目標對象增強。
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/88007