1. 装饰器的主要功能和装饰器的固定结构
- 在不改变函数调用方式的基础上在函数的前、后添加功能。
2. 装饰器的固定格式
2.1 装饰器的固定格式
def timer(func):
def inner(*args,**kwargs):
'''执行函数之前要做的'''
re = func(*args,**kwargs)
'''执行函数之后要做的'''
return re
return inner
2.2 wraps版装饰器固定格式
from functools import wraps
def deco(func):
@wraps(func) #加在最内层函数正上方
def wrapper(*args,**kwargs):
return func(*args,**kwargs)
return wrapper
3. 带参数的装饰器
假如你有成千上万个函数使用了一个装饰器,现在你想把这些装饰器都取消掉,你要怎么做?
一个一个的取消掉? 没日没夜忙活3天。。。
过两天你领导想通了,再让你加上。。。
def outer(flag):
def timer(func):
def inner(*args,**kwargs):
if flag:
print('''执行函数之前要做的''')
re = func(*args,**kwargs)
if flag:
print('''执行函数之后要做的''')
return re
return inner
return timer
# False时不装饰,True时装饰
@outer(False)
def func():
print(111)
func()
4. 多个装饰器装饰同一个函数
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 # 从下往上执行
def func():
print('in f')
func()
当多个装饰器装饰同一个函数时,装饰器的运行顺序是从下到上的,比如上面这个f函数,装饰器运行的顺序应当是wrapper1 ->wrapper2
分析函数func的运行过程
- 传入wrapper1 的方法是func
- 传入wrapper2的方法是运行wrapper1返回的inner1
- 执行函数func
- 执行wrapper1 后续代码
- 执行wrapper2后续代码
网友评论