裝飾器可以在不修改目標函式程式碼的前提下, 在目標函式執行前後增加一些額外功能
例如有一個簡單的函式
import time
def func1():
print("這是一個簡單的函式")
time.sleep(2)
想給這個函式增加一個計算用時的功能,那麼可以利用裝飾器
讓該函式使用裝飾器,即在函式的定義的上方新增@函式名,如下,其相當於將func1=outer(func1)寫到後邊的程式中
至於函式外的引數在函式中使用的原因是閉包
import time
def outer(f): def inner(): start = time.time() f() end = time.time() print(end-start) return inner @outer#func1=outer(func1) def func1(): print("這是一個簡單的函式") time.sleep(2) func1()
#輸出
這是一個簡單的函式
2.000551223754883
若是一個有引數的函式需要裝飾則
def outer(f): def inner(x,y): start = time.time() f(x,y) end = time.time() print(end-start) return inner @outer#func1=outer(func1) def add(x,y): print(x+y) time.sleep(2) add(1,2)
若想要在裝飾器中加一些其他語句如判斷語句來控制某些功能是否使用
import time def judge(flag=True): def outer(f): def inner(x,y): start = time.time() f(x,y) end = time.time() print(end-start) return inner if flag==True : print("這是一個功能") return outer @judge()#judge()其實相當於outer,除此之外可以在此新增引數 def add(x,y): print(x+y) time.sleep(2) add(1,2)