python-装饰器-简单装饰器
一、装饰器概念
【1】装饰器:本质上是个函数,作用是为了已经存在的对象(大多数是函数)添加额外的功能
【2】返回值:返回值也是一个函数对象
【3】使用场景:插入日志、性能测试、事物处理、缓存、权限校验等场景
二、代码举例
【1】需求:想要查看测试用例代码业务逻辑执行的时间
以下代码可用,但不可取。原因:别人想要使用你的新功能的时候,会要从调用foo1变成调用subtime函数,会给别人造成工作量
import time
# 要计算执行测试用例的服务器时间
# 测试用例代码业务逻辑(原有的业务逻辑最好不要修改,也不要重写,会造成工作量增大;可以采用高阶函数),不可更改
def foo1():
time.sleep(1)
print('测试用例执行逻辑代码')
# 自己设计的新功能
# 计算时间函数
# 把业务逻辑函数名作为入参传入,在函数中执行
def subtime(func):
begin_time = time.time()
# 执行业务逻辑函数
func()
end_time = time.time()
print('业务逻辑代码实现的时间是:',end_time-begin_time)
subtime(foo1)
【2】以上代码可优化,只需要增加一个内置函数,内置函数内写具体的实现逻辑;外部函数返回内置函数名,在最后将调用的函数赋值给原先的测试用例代码业务逻辑。这样其他人调用的函数名称还是没有变化,并且可以使用新写的功能
import time
# 要计算执行测试用例的服务器时间
# 测试用例代码业务逻辑(原有的业务逻辑最好不要修改,也不要重写,会造成工作量增大;可以采用高阶函数
def foo1():
time.sleep(1)
print('测试用例执行逻辑代码')
# 计算时间函数
# 把业务逻辑函数名作为入参传入,在函数中执行
def subtime(func):
def inner(): # 把主要逻辑代码创建内置函数,作为外部函数的返回值
begin_time = time.time()
# 执行业务逻辑函数
func()
end_time = time.time()
print('业务逻辑代码实现的时间是:',end_time-begin_time)
return inner
foo1 = subtime(foo1) # 首先调用subtime函数,把foo1作为入参,返回inner函数名;将inner函数名赋值给foo1
foo1() # 相当于执行inner函数
【3】可以简化最终赋值语句的编写,需要用到语法糖,在被装饰函数上@装饰函数
import time
# 要计算执行测试用例的服务器时间
# 计算时间函数
def subtime(func):# 装饰函数
def inner():
begin_time = time.time()
func()
end_time = time.time()
print('业务逻辑代码实现的时间是:',end_time-begin_time)
return inner
# foo1 = subtime(foo1) # 首先调用subtime函数,把foo1作为入参,返回inner函数名;将inner函数名赋值给foo1
# 测试用例代码业务逻辑(原有的业务逻辑最好不要修改,也不要重写,会造成工作量增大;可以采用高阶函数
@subtime # 语法糖,相当于foo1 = subtime(foo1)
def foo1():# 被装饰函数
time.sleep(1)
print('测试用例执行逻辑代码')
foo1() # 相当于执行inner函数