裝飾器是Python中一種特殊的語(yǔ)法結(jié)構(gòu)物遇,它允許程序員在不修改被裝飾對(duì)象源代碼的情況下期升,通過(guò)在函數(shù)或類定義前加上“@裝飾器函數(shù)”的形式來(lái)動(dòng)態(tài)地?cái)U(kuò)展或修改原始行為镊尺,使得代碼復(fù)用和可維護(hù)性更好寸莫。
裝飾器本質(zhì)是一個(gè)閉包函數(shù)悲立,所以在講解裝飾器之前鹿寨,需要先理解Python閉包函數(shù)的概念,閉包函數(shù)有以下幾個(gè)特點(diǎn):
- 閉包函數(shù)是函數(shù)的嵌套薪夕,函數(shù)內(nèi)還有函數(shù)脚草,即外層函數(shù)嵌套一個(gè)內(nèi)層函數(shù)。
- 在外層函數(shù)定義局部變量寥殖,在內(nèi)層函數(shù)通過(guò)nonlocal引用玩讳,并實(shí)現(xiàn)指定功能。
裝飾器-記錄函數(shù)運(yùn)行時(shí)間:
import time
def time_func(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(func.__name__ + "\n" + f"{end - start:0.4f}")
return result
return wrapper
@time_func
def fib(n):
if n <= 1:
return n
else:
return fib(n-1) + fib(n-2)
print(fib(30))
在這個(gè)例子中嚼贡,我們定義了一個(gè)計(jì)時(shí)器裝飾器函數(shù)time_func熏纯,它接收一個(gè)函數(shù)作為參數(shù),并返回一個(gè)新的函數(shù)wrapper粤策。wrapper函數(shù)包含了原始函數(shù)fib的所有參數(shù)(使用args和*kwargs)樟澜,并在執(zhí)行原始函數(shù)之前記錄起始時(shí)間,在執(zhí)行結(jié)束后打印運(yùn)行時(shí)間叮盘。
使用裝飾器語(yǔ)法糖@time_func修飾fib函數(shù)秩贰,可以自動(dòng)將fib傳遞給time_func函數(shù),將fib函數(shù)修改為wrapper函數(shù)柔吼,并返回修改后的wrapper函數(shù)毒费。最后我們調(diào)用fib(30)來(lái)測(cè)試程序的運(yùn)行時(shí)間。