Python 无固定参数装饰器

装饰器是什么

Python 装饰器(fuctional decorators)是用于拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能。 
这个函数的特殊之处在于它的返回值也是一个函数,这个函数是内嵌"原"函数的函数。

装饰器其实就是一个闭包函数,它是有两层的函数,它具有函数传参功能。

装饰器使用场景

当在多个地方出现雷同的代码块,且这些代码与核心业务没有直接关联的都可以用装饰器来代替,装饰器不仅能减少代码量,还使得代码逻辑更清晰、可读性更强,你只需专注于业务逻辑处理就行了。

装饰器调用顺序

装饰器是可以叠加使用的,那么使用装饰器以后代码是啥顺序呢?
对于Python 中的“@”语法糖,装饰器的调用顺序与使用“@”语法糖声明的顺序相反。

普通装饰器在Python 中运用

首先,我们来回顾一下普通的装饰器,这是一个用于计算函数执行的耗时装饰器。

import time
def waste_time(func): 
    def function(*args,**kwargs):
        start_time=time.time()
        result=func(*args,**kwargs)
        end_time=time.time()
        spend=end_time-start_time
        print("函数%s 总共耗时%.3f秒:"%(func.__name__,spend))
        return result
    return function

带参数的装饰器只需要在原来那个不带参数的装饰器基础上之上在最外层套一个函数,该函数中定义一个参数,然后嵌套函数中引用该参数即可实现。

无固定参数装饰器在Python 中运用

再来,看看带参数的装饰器,这个装饰器可以通过传入参数的不同进行不同逻辑的处理:

def decorator_have_args(arg):
    def function_out(function):
        def function_in(*args,**kwargs):
            print("the log is:%s"%arg)
            print("call %s()"%function.__name__)
            print("args={}".format(*args))
            # print("kwargs={}".format(**kwargs))
            if(arg=="flag1"):
                function(*args,**kwargs)
            elif(arg=="flag2"):
                for i in range(3):
                    function(*args,**kwargs)
            else:
                print("pass")
        return function_in
    return function_out

@decorator_have_args("flag1")
def testa(a):
    print("this is testa funcion,a=%s"%a)

@decorator_have_args("flag2")
def testb(b):
    print("this is testb funcion,b=%s"%b)

@decorator_have_args("flagx")
def testc(c):
    print("this is testb funcion,b=%s"%c)

if __name__ == '__main__':
    testa("good")
    testb("better")
    testc("best")

总结

今天的分享是:Python 中如何使用无固定参数的装饰器,让代码结构和逻辑更加清晰,以及Python 的具体实现。小伙伴们可以参考以上代码片段,将代码运行起来将更有助于理解装饰器的执行原理。

欢迎关注【无量测试之道】公众号,回复【领取资源】,
Python编程学习资源干货、
Python+Appium框架APP的UI自动化、
Python+Selenium框架Web的UI自动化、
Python+Unittest框架API自动化、

资源和代码 免费送啦~
文章下方有公众号二维码,可直接微信扫一扫关注即可。

备注:我的个人公众号已正式开通,致力于测试技术的分享,包含:大数据测试、功能测试,测试开发,API接口自动化、测试运维、UI自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:

 添加关注,让我们一起共同成长!

猜你喜欢

转载自blog.csdn.net/weixin_41754309/article/details/113432760