您好,登錄后才能下訂單哦!
裝飾器
裝飾器可以疊加使用,執行是從下到上執行的
無參裝飾器 @logger
1.它是一個語法糖
2.函數作為它 的形參
3.返回值也是一個函數
4.可以使用 @function 方式,簡化調用
注意: 此處的裝飾器的定義并不準確,只是方便理解
裝飾器和高階函數
裝飾器是高階函數,但裝飾器是對傳入函數功能的裝飾
裝飾器函數的演化過程:
"""
裝飾器
一個普通的加法函數,想增強他的功能
"""
def add(x,y):
return x + y
"""增加信息輸出功能"""
def add(x,y):
print("call add,x+y")# 日志輸出到控制臺
return x + y
"""上面的函數是完成了需求,但是有缺點
1.print語句的耦合度太高
2.加法函數屬于業務功能,而輸出信息的功能,屬于非業務功能代碼,不該放在業務函數加法中"""
"""把添加功能移出來"""
def logger(fn):
print("call add,x+y")
ret = fn(3,4)
return ret
print(logger(add))
def logger(fn,x,y):
print("call add,x+y")
ret = fn(x,y)
return ret
print(logger(add,3,4))
def logger(fn,*args,**arges):
print("call add,x+y")
ret = fn(*args,**arges)
return ret
print(logger(add,3,4))
def logger(fn):
def wrapper(*args,**arges): # 可變位置傳參,可變關鍵字傳參
print("call add,x+y")
ret = fn(*args,**arges) # 參數解構
return ret
return wrapper
print(logger(add)(4,5))
add = logger(add) # add = wrapper
ret = add(4,5) # wrapper(4,5)
裝飾器 核心思想
import datetime
def logger(fn):
def wrapper(*args,**arges): # 可變位置傳參,可變關鍵字傳參
print("前面增強")
start = datetime.datetime.now()
ret = fn(*args,**arges) # 參數解構
delta = (datetime.datetime.now() - start).total_seconds()
print("so fast") if delta < 5 else print("so slow")
print("后面增強")
return ret
return wrapper
@logger # add = logger(add) => add 就是 wrapper
def add(x,y): # wrapper(4,5)
return x + y
ret = add(4,5) # wrapper(4,5) => logger(add)(4,5)
print(ret)
理解裝飾器:
1.裝飾器函數
2.前置功能增強
3.被增強函數
4.后置功能增強
def logger(fn): # 調用 被裝飾的函數
def wrapper(*args,**kwargs): # 傳入被裝飾函數參數
print("before function") # 前置功能增強
ret = fn(*args,**kwargs) # 使用被裝飾函數的功能
print("after function") # 后置功能增強
return ret # 返回被裝飾函數的 計算結果
return wrapper # 返回 被裝飾的函數
@logger # 無參裝飾器
# @logger <==> add = logger(add) = wrapper # add(x,y) == wrapper(x,y)
def add(x,y): # 被裝飾的函數
return x + y
add(3,4)
print(add(3,4))
#看似調用add函數,使用了裝飾器@logger之后,實際上 調用的是 wraaper(*args,**kwargs)函數
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。