把乙個函式當作引數,返回乙個替代版的函式
本質就是乙個返回函式的函式
「在不改變原函式的基礎上,給函式增加功能」
函式對修改是封閉的,對擴充套件是開放的
也就是說,是給乙個已經寫好的函式進行修改時,並不改變這個已經寫好的函式,而是再寫乙個函式來進行呼叫這個函式,但是在原本已經呼叫過這個函式的位置不能一一修改,所以需要裝飾器,裝飾器需要在已經寫好的函式之前寫好,並在已經寫好的函式之前加上語法糖,也叫糖衣語法,顧名思義,在呼叫此函式時,會先讀取他的糖衣語法,再讀取原本的函式,既滿足了對函式的修改不修改原函式,又滿足了呼叫時只是呼叫原函式。
import time
def decorator(func): #裝飾器,引數是乙個函式
print(time.time()) #此函式的功能是列印乙個時間
func(*args) #執行原函式
@decorator #語法糖
def f1(func_name):
print('this is a function ' + func_name)
@decorator
def f2(func_name1,func_name2):
print('this is a function ' + func_name1)
print('this is a function ' + func_name2)
f1('test')
f2('test1','test2')
示例:
import time
def decorator(func):
print(time.time())
func(*args)
@decorator
def f1(func_name):
print('this is a function ' + func_name)
@decorator
def f2(func_name1,func_name2):
print('this is a function ' + func_name1)
print('this is a function ' + func_name2)
f1('test')
f2('test1','test2')
執行結果:
也可以加多個引數
當乙個函式已經有裝飾器時,可以再增加另乙個裝飾器
示例:
def decorator_a(fun):
print('get in decorator_a')
def inner_a(*args, **kwargs):
print('get in inner_a')
res = fun(*args, **kwargs)
return res
return inner_a
def decorator_b(fun):
print('get in decorator_b')
def inner_b(*args, **kwargs):
print('get in inner_b')
res = fun(*args, **kwargs)
return res
return inner_b
def decorator_c(fun):
print('get in decorator_c')
def inner_c(*args, **kwargs):
print('get in inner_c')
res = fun(*args, **kwargs)
return res
return inner_c
@decorator_a
@decorator_b
@decorator_c
def f(x):
print('get in f')
return x * 2
f(2)
執行結果:
get in decorator_c
get in decorator_b
get in decorator_a
get in inner_a
get in inner_b
get in inner_c
get in f
可以看出,當函式存在多個裝飾器時,會自下向上執行裝飾器的殼子,自上向下執行裝飾器內部。 python中如何使用裝飾器
1.如果裝飾器是多層的,誰距離函式最近,則優先使用那個裝飾器 新增校驗功能的裝飾器 import time def verify1 t def decorate func print 第一層校驗正在進行中.time.sleep t print 校驗完畢!呼叫原函式 func args,kwargs ...
python裝飾器 如何使用函式裝飾器
問題舉例 有時候我們想為多個函式統一新增某種功能,比如計時統計 記錄日誌,快取運算結果等 我們並不想在每個函式內一一新增完全相同的 有什麼解決方案嗎?定義裝飾器函式,用它在原函式的基礎上生成乙個新增新功能的函式來代替原函式 def memo func cache def wrap args res ...
如何使用函式裝飾器?
需求 某些時候我們想為多個函式,統一新增某種功能,比如計時統計 日誌記錄 快取運算結果等等 我們不想在每個函式內一一新增完全相同的 有什麼好的解決方案?思路 定義裝飾器函式,用它來生成乙個在原函式基礎上新增了新功能的函式,替代原函式 def memo func cache def wrap args...