1、装饰器的简介及作用
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。
2、装饰器的基本语法
2.1 不含参数的装饰器
####不含参数的基本装饰器
def decorator(fun): ##decorator:装饰器的名称;fun:装饰器内置函数;
def wrapper(): ##wrapper:装饰器的真正内容;
print ('**') ##添加的功能
fun() ##调用原函数
return wrapper ##返回装饰器的值
@decorator ##指定函数使用装饰器
def f1(): ##函数定义
print ('--')
2.2 函数带参数的装饰器
###带参数的装饰器
def decorator(func):
def wrapper(*args,**kwargs):
print('**')
func(*args,**kwargs)
return wrapper
@decorator
def f1(func_name):
print('This is a function ' + func_name)
f1('linux')
2.3 原函数带返回值的装饰器
###原函数带有返回值
def time_test(func):
def wrapper(*args,**kwargs):
str_time = time.time()
res = func(*args,**kwargs) ##放置一个参数用来接收原函数的返回值
return res ##返回原参数的返回值
return wrapper
@time_test
def fun_list(n):
return [i **2 for i in range(n)]
print (fun_list(100))
2.4 装饰器中的其他小参数
###文档调用
fun_list.__doc__ ##指定fun_list的说明文档
fun_list.__name__ ##指定fun_list的名称
###函数说明
@functools.wraps(fun) ##将函数wrappers的函数信息与fun替换
###多装饰器顺序
@decorator_b ##装饰器按照顺序进行装饰
@decorator_a
def f(x):
print('This is f')
###当修饰器含参数时
通过多个修饰器递归调用则可我解决
【说明】上述小示例可参考《初学Python小练习》中的33、34题。
3、示例
![](https://img-blog.csdnimg.cn/20200421195643787.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDU2MjI0,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20200421202219710.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDU2MjI0,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20200421213147618.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDU2MjI0,size_16,color_FFFFFF,t_70)