版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/taczeng/article/details/89604042
背景:学习python的人肯定听过一个词,装饰器,那到底什么是装饰器,网络知识有很多介绍,这里,我基于自己的理解,进行一个系统总结,希望能让更多人加深理解
作用:概括的讲,装饰器的作用就是为已经存在的函数或对象添加额外的功能
实战:
应用场景:
1,引入日志
2,函数执行时间统计
3,执行函数前预备处理
4,执行函数后清理功能
5,权限校验等场景
6,缓存
7,事务处理
装饰器怎么用:
NO1.简单装饰器(不带参数):
背景:我们代码里面经常有各种函数,为了监控到哪个函数出了问题,可以不修改代码的情况下为他们加入日志监控(当然,这只是其中一种应用,具体懂了装饰器之后,会有更多牛叉的应用)
def debug(func):
def error_check():
print('{func} error'.format(func=func.__name__))
return func()
return error_check
@debug
def decorator_fun_a():
print('do sth')
pass
@debug
def decorator_fun_b():
print('do sth')
pass
NO2.带参数装饰器(简单参数):
def debug(func):
def error_check(arg):
print('{func} error'.format(func=func.__name__))
return func(arg)
return error_check
@debug
def decorator_fun_a(arg):
print('do sth use {arg}'.format(arg=arg))
pass
@debug
def decorator_fun_b(arg):
print('do sth {arg}'.format(arg=arg))
pass
NO3.多参数的装饰器(通用):
def debug(func):
def error_check(*args, **kwargs): # 能解析一切参数了
print('{func} error'.format(func=func.__name__))
return func(*args, **kwargs)
return error_check
@debug
def decorator_fun_a(arg):
print('do sth use {arg}'.format(arg=arg))
pass
@debug
def decorator_fun_b(arg1, arg2):
print('do sth {arg1},{arg2}'.format(arg1=arg1, arg2=arg2))
pass
NO4.更高阶的装饰器:
背景:现在需要针对不同函数打印不同日志级别
def debug(level):
def log_check(func):
def log_check_inner(*args, **kwargs): # 能解析一切参数了
print('{level} in {func}'.format(level=level, func=func.__name__))
return func(*args, **kwargs)
return log_check_inner
return log_check
@debug(level='DEBUG')
def decorator_fun_a(arg):
print('do sth use {arg}'.format(arg=arg))
pass
@debug(level='ERROR')
def decorator_fun_b(arg1, arg2):
print('do sth {arg1},{arg2}'.format(arg1=arg1, arg2=arg2))
pass
有点绕,但是也好理解,你可以把它们当成函数,一个个执行,先执行最里面的,再执行外面的,debug调试一下就能看出来
拓展学习:希望大家可以有空拓展学习下类装饰器,以及python自带的装饰器,这里就不写了