裝飾器可能有點陌生,可是裝飾器它也是由函數而組成,那它有什麼做用呢?app
其實就是:不想修改函數的調用方式,但可在原來的函數先後添加功能。開放封閉原則:函數
一、仍是這個例子,定義兩個函數,func、timmer,簡單來講 func 是執行所需的時間,timmer 是來計算傳入的參數執行時長。spa
二、能夠看到timmer函數裏面有一個被裝飾的函數。既是 func 傳入 timmer。code
# 1.裝飾器初成 import time def func(): time.sleep(1) print('我在等待一秒鐘') def timmer(f): # 裝飾器函數 def inner(): start = time.time() f() # 被裝飾函數 end = time.time() print(end-start) return inner # 別加 () 調用函數了,應傳內部函數名字 ff = timmer(func) ff()
三、運行步驟以下圖blog
一、裝飾器函數 timmerclass
二、被裝飾函數 func,直接@裝飾器函數,執行順序如上圖所示。import
# 2.裝飾器使用 import time def timmer(f): def inner(): start = time.time() ret = f() end = time.time() return end-start, ret return inner @timmer # @裝飾器函數名 def func(): # 被裝飾的函數 time.sleep(1) return '我在等待一秒鐘' print(func())
一、萬能傳參,其實就是用咱們前面所學的函數傳參方法,*args 和 **kwargs擴展
# 3.萬能參數裝飾器 import time def timmer(f): def inner(*args, **kwargs): # *args, **kwargs 萬能接收參數 start = time.time() ret = f(*args, **kwargs) # *args, **kwargs 萬能傳入參數 end = time.time() print(end-start) return ret return inner @timmer def func(a, b): print(a, b) time.sleep(1) return '我在等待一秒鐘' @timmer def func1(a): print(a) time.sleep(1) return '我在等待一秒鐘' print(func(1, 2)) print(func1(1))
一、裝飾器這樣咱們就能夠遊刃有餘的寫:在被裝飾函數之 前 、後 要作的功能了。方法
二、固定模式以下:im
# 4.裝飾器固定模式 def wrapper(f): # 裝飾器函數:wrapper 被裝飾函數:f def inner(*args, **kwargs): # 被裝飾函數:inner == f # 在被裝飾函數之 前 要作的功能 ret = f(*args, **kwargs) # 在被裝飾函數之 後 要作的功能 return ret return inner @wrapper # @裝飾器函數,實際至關於:wrapper(fon) def fon(a): print('打醬油') return a r = fon('固定模式就是這樣') # 實際至關於調用:inner print(r)
有沒有裝飾器都不會影響原函數的執行,只是可以對現有的進行 先後 擴展,是否是頗有必要掌握好的技能呢?
若有更多歡迎來QQ交流羣:482713805