一、装饰器的定义
装饰器本质上是一个Python函数,可以让其他函数在不需要做任何代码改动的前提下增加额外的功能,装饰器的返回值也是一个函数对象。装饰器的使用场景有:插入日志、性能测试、事务处理、缓存、权限校验等。
二、装饰器的使用
def wrapper(func): # func = holiday
def inner(*args, **kwargs):
print('在被装饰的函数执行之前做的事:比如查看今天的工作邮箱是否有待办事项')
ret = func(*args, **kwargs)
print('在被装饰的函数执行之后做的事:比如下班前检查电源插座的开关是否关闭')
return ret
return inner
@wrapper # holiday = wrapper(holiday)
def holiday(day):
''' 这是一个放假通知 '''
print('全体放假%s天'%day)
return '好开心'
print(holiday.__name__)
print(holiday.__doc__)
print("--------------下面调用该函数看下效果-----------------------------")
holiday("6")
# 输出结果
inner
None
--------------下面调用该函数看下效果-----------------------------
在被装饰的函数执行之前做的事:比如查看今天的工作邮箱是否有待办事项
全体放假6天
在被装饰的函数执行之后做的事:比如下班前检查电源插座的开关是否关闭
上面这个例子中的holiday的函数名变成inner了,如果我们不想让函数名称改变可以加入一个常用的装饰器wraps,代码如下:
from functools import wraps
def wrapper(func): # func = holiday
@wraps(func)
def inner(*args, **kwargs):
print('在被装饰的函数执行之前做的事:比如查看今天的工作邮箱是否有待办事项')
ret = func(*args, **kwargs)
print('在被装饰的函数执行之后做的事:比如下班前检查电源插座的开关是否关闭')
return ret
return inner
@wrapper # holiday = wrapper(holiday)
def holiday(day):
''' 这是一个放假通知 '''
print('全体放假%s天'%day)
return '好开心'
print(holiday.__name__)
print(holiday.__doc__)
print("--------------下面调用该函数看下效果-----------------------------")
holiday("6")
# 输出结果
holiday
这是一个放假通知
--------------下面调用该函数看下效果-----------------------------
在被装饰的函数执行之前做的事:比如查看今天的工作邮箱是否有待办事项
全体放假6天
在被装饰的函数执行之后做的事:比如下班前检查电源插座的开关是否关闭