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函数

 

posted on 2022-05-08 20:55  墙角一枝花  阅读(53)  评论(0编辑  收藏  举报