一、什么叫装饰器?
装饰器(decorator)的本质是一个函数,它接收一个函数作为参数,并返回一个被装饰过后的函数
二、装饰器的作用?
在不修改被修饰过函数的代码和和调用方式的情况下,给被装饰函数增加额外的功能
三、装饰器的应用场景?
插入日志、性能测试、事务处理、缓存、权限校验等场景
四、下面主要介绍函数装饰器
1.不带参数的装饰器
# 修饰函数不传参数
def log(fn): # 装饰器‘log’本身就是函数,传入了一个函数‘fn’作为参数
def ff(): # 修饰函数---起到修饰作用
print('你好')
fn()
return ff # 返回值为一个函数
@log
def f1():
print('hello')
# 调用函数
f1()
# 返回值
你好
hello
'''说明:
调用函数f1()时,先执行@log,最终会‘return’ff。
只需要看ff。ff做了个打印和调用函数fn(),调用函数fn()就等价于调用f1().
所以装饰器的本质就是把被修饰的函数‘f1’作为参数传入到修饰器'log'中,
然后在log下返回一个装饰函数‘ff’。然后在装饰函数'ff'中对被装饰函数‘f1’进行修饰和调用
'''
# 修饰函数传参数
def log(fn): # 装饰器log
def ff(*args, **kwargs): # 修饰函数‘ff’传入了不定长参数
print('开始打印日志了')
result = fn(*args, **kwargs) # 调用被装饰函数‘f2’,用变量‘result’接收
print('打印日志了结束')
return result # 装饰函数ff返回值为被装饰函数‘f2’
return ff
@log
def f2():
print('日志')
# 调用函数‘f2’
f2()
# 返回值
开始打印日志了
日志
打印日志了结束
2.带参数的装饰器
def my_log(name): # 参数‘name’
def log(fn):
def ff(*args, **kwargs):
print(f'开始打印"{name}"日志了')
result = fn(*args, **kwargs)
print(f'打印"{name}"日志结束了')
return result
return ff
return log # 返回了一个装饰器
@my_log(name='错误')
def f3():
print('日志')
# 调用函数
f3()
# 返回值
开始打印"错误"日志了
日志
打印"错误"日志结束了
'''
说明:带参数的装饰器和不带参数的装饰器差别不大,只是带参数的装饰器传入了参数,返回了一个装饰器
掌握了不带参数的装饰器,带参数的装饰器就是在不带参数的外面嵌套了一层函数,没有其他特殊的东西
'''
标签:函数,python,装饰,ff,日志,浅析,def,log From: https://www.cnblogs.com/zy7941246/p/17346318.html