10-3 函數裝飾器
阿新 • • 發佈:2018-10-04
python **kwargs 開放 開放封閉原則 函數名 不想 返回 多個參數 app
裝飾器形成的過程
最簡單的裝飾器----有返回值的----有一個參數----萬能參數裝飾器的作用:
不想修改函數的調用方式,但是還想再原來的函數前後添加功能#原則:開放封閉原則
開放: 對擴展是開放的
封閉: 對修改是封閉的
語法糖:@裝飾器函數名,@timmer等價於func = timmer(func),其中func()是被裝飾函數,timmer()就是裝飾器函數
最簡單的裝飾器
import time def timmer(f): start = time.time() f() end = time.time() print(end-start) def func(): time.sleep(0.1) print(‘nice!‘) timmer(func)
裝飾有返回值的裝飾器
import time #timmer()就是裝飾器函數,只是對一個函數有裝飾作用 def timmer(f):#通過此閉包函數返回一個內部函數名,然後在外部接收,讓接收的函數名與外部函數名保持一致即可 def inner(): start = time.time() ret = f() #被裝飾的函數 end = time.time() print(end-start) return ret return inner @timmer #語法糖---@裝飾器函數名,等價於func = timmer(func) def func(): # 被裝飾的函數 time.sleep(0.1) print(‘nice!‘) return ‘summertrain‘ # func = timmer(func) result = func() print(result)
有一個參數
import time #timmer()就是裝飾器函數 def timmer(f):#通過此閉包函數返回一個內部函數名,然後在外部接收,讓接收的函數名與外部函數名保持一致即可 def inner(a): start = time.time() ret = f(a) #被裝飾的函數 end = time.time() print(end-start) return ret return inner @timmer #語法糖---@裝飾器函數名,等價於func = timmer(func) def func(a): # 被裝飾的函數 time.sleep(0.1) print(‘nice!‘,a) return ‘summertrain‘ # func = timmer(func) result = func(1) print(result)
萬能參數
#裝飾帶多個參數,且包括按照位置以及參數傳參的裝飾器 import time #timmer()就是裝飾器函數 def timmer(f):#通過此閉包函數返回一個內部函數名,然後在外部接收,讓接收的函數名與外部函數名保持一致即可 def inner(*args,**kwargs): start = time.time() ret = f(*args,**kwargs) #被裝飾的函數 end = time.time() print(end-start) return ret return inner @timmer #語法糖---@裝飾器函數名,等價於func = timmer(func) def func(a,b): # 被裝飾的函數 time.sleep(0.1) print(‘nice!‘,a,b) return ‘summertrain‘ # func = timmer(func) result = func(1,b=22) print(result)
裝飾器的固定模式
#例子 import time def wrapper(f): # f是被裝飾的函數 def inner(*args,**kwargs): ‘‘‘在被裝飾函數之前要做的事兒‘‘‘ ret = f(*args,**kwargs) ‘‘‘在被裝飾函數之前要後的事兒‘‘‘ return ret return inner @wrapper def func(a,b): time.sleep(0.1) print(‘nice!‘,a,b) return ‘summertrain‘ #減縮版 def wapper(func): def inner(*args,**kwargs): ret = func(*args,**kwargs) return ret return inner @wapper #qqxing = wapper(qqxing) def qqxing(): print(1111) result = qqxing()
10-3 函數裝飾器