1. 裝飾器的主要功能和裝飾器的固定結(jié)構(gòu)
- 在不改變函數(shù)調(diào)用方式的基礎上在函數(shù)的前、后添加功能。
2. 裝飾器的固定格式
2.1 裝飾器的固定格式
def timer(func):
def inner(*args,**kwargs):
'''執(zhí)行函數(shù)之前要做的'''
re = func(*args,**kwargs)
'''執(zhí)行函數(shù)之后要做的'''
return re
return inner
2.2 wraps版裝飾器固定格式
from functools import wraps
def deco(func):
@wraps(func) #加在最內(nèi)層函數(shù)正上方
def wrapper(*args,**kwargs):
return func(*args,**kwargs)
return wrapper
3. 帶參數(shù)的裝飾器
假如你有成千上萬個函數(shù)使用了一個裝飾器,現(xiàn)在你想把這些裝飾器都取消掉,你要怎么做?
一個一個的取消掉? 沒日沒夜忙活3天。。。
過兩天你領導想通了,再讓你加上。。。
def outer(flag):
def timer(func):
def inner(*args,**kwargs):
if flag:
print('''執(zhí)行函數(shù)之前要做的''')
re = func(*args,**kwargs)
if flag:
print('''執(zhí)行函數(shù)之后要做的''')
return re
return inner
return timer
# False時不裝飾,True時裝飾
@outer(False)
def func():
print(111)
func()
4. 多個裝飾器裝飾同一個函數(shù)
def wrapper1(func):
def inner1():
print('wrapper1 ,before func')
func()
print('wrapper1 ,after func')
return inner1
def wrapper2(func):
def inner2():
print('wrapper2 ,before func')
func()
print('wrapper2 ,after func')
return inner2
@wrapper2
@wrapper1 # 從下往上執(zhí)行
def func():
print('in f')
func()
當多個裝飾器裝飾同一個函數(shù)時,裝飾器的運行順序是從下到上的,比如上面這個f函數(shù),裝飾器運行的順序應當是wrapper1 ->wrapper2
分析函數(shù)func的運行過程
- 傳入wrapper1 的方法是func
- 傳入wrapper2的方法是運行wrapper1返回的inner1
- 執(zhí)行函數(shù)func
- 執(zhí)行wrapper1 后續(xù)代碼
- 執(zhí)行wrapper2后續(xù)代碼