装饰器可以在不改动函数的前提下对函数的功能进行扩展,常用于
- 引入日志,
- 统计函数执行时间,
- 函数执行前预处理
- 函数执行后清理
- 权限校验
- 缓存
装饰器的语法以 @ 开头
def pri(func): # 传入的func参数为函数名,不是函数
print('pri is running')
def one():
print('one is running')
func()
return one # 返回的时函数名
@pri # 欲执行test(),先执行装饰器pri(test),结束返回one
def test():
print('test')
test()
# 执行one(),执行test(),结束test(),结束one()
多个装饰器的调用顺序从下往上
def pri(func):
print('pri is running')
def one():
print('one is running')
func()
return one
def pro(func):
print('pro is running')
def two():
print('two is running')
func()
return two
@pri
@pro
def test():
print('test')
test()
# 欲执行test(),执行装饰器pro(test),结束返回two【参数func是test】
# 欲执行two(),执行装饰器pri(two),结束返回one【参数func是two】
# 执行one(),执行two(),执行test()
# 结束test(),结束two(),结束one()