美文网首页
python_装饰器篇(基础理解)

python_装饰器篇(基础理解)

作者: 金鱼座 | 来源:发表于2019-09-30 11:09 被阅读0次

    大家好,我是金鱼座,一个走在测试领域这片蓝海中, 蹉跎前行的技术渣渣,唯有一直走下去,也许能改变点什么,加油!

    python中其实大家很多人都听过装饰,看别人写的代码,突然加上了装饰器,总感觉高大上了一些,有种这个人很NB的感觉,实际上这种思想是你在不了解装饰的情况下有的,下面就来说说自己对装饰器的理解

    装饰器按照字面的意思就知道主要起到装饰作用的, 对于被装饰的东西内部核心是无法改变的,这个大家一定要有个共识,装饰器改变的是被装饰方法外部的一些行为,而无法改变被装饰方法本身内部

    那么装饰器本身能干那些事情呢?( 我就按照自己的理解,来总结下自己认识下能干的事情吧)

    1. 装饰器可以给被装饰方法前,添加新的业务逻辑操作,有点执行前置条件
    2. 装饰器可以给被装饰方法后,添加新的业务逻辑操作,相当于执行后置条件
    3. 装饰器可以改变被装饰方法的入参值,比如传入1 ,而实际执行function的时候是2,
    4. 装饰器可以改变被装饰方法的返回值(包括返回值个数, 返回值内容)

    针对上述的情况,下面我举例来进行相关说明:

    给被装饰方法添加前置、后置执行条件

    def deco(fun):
        def inner():
            print("装饰器, 前置条件")           
            fun()
             print("装饰器, 后置条件")     
        return inner
    
    @deco
    def  noarg():
        print("no agrs")
    
    noarg()
    
    结果

    看代码执行可知道,在执行noargs方法时,会优先执行打印“装饰器,前置条件”, 这就是一种给被装饰添加前置|后置的操作, 你可以添加任意执行内容

    装饰器可以改变被装饰方法的入参值

    def change_args(fun):
        def warpper(a, b):
            c = a + 1
            d = b + 1
            fun(a, b)
        return warpper
    
    @change_args
    def add(a, b):
        print(a, b, a+b)
    
    add(1, 1)
    
    结果

    看上面的执行结果可知,我实际传值为,a, b 都为1, 但是结果打印确实2,2,4,由此可知通过装饰器我修改了被装饰方法的入参

    装饰器修改被装饰函数的返回值

    def return_deco(fun):
        def wrapper():
            a = 1
            b =2
            c = fun()
            return a, b, c
        return wrapper
    
    
    @return_deco
    def noreturn():
        print("当前方法没有返回值,返回值为None")
    
    
    a = noreturn()
    print(*a)
    
    结果

    看执行结果可知,本身noreturn方法是没有返回值的,通过装饰后,a获取到值,这种就是修改装饰器结果

    看上面的几个例子可知, 我们平常所说的装饰器主要能干什么,知道这些后,在进行了解装饰的几种样式就不难了,

    跟着我往下看:

    1. 无任何参数的装饰器
    针对这种方法,我不做在多的介绍,看上面的第一段代码中就可知晓

    2,被装饰方法带有不定数目的参数
    这种情况,看上面第二段代码可知其基本使用,无非是不定数目的话需要用到大家很熟悉的 *args, **kwargs

    def args_kwargs(fun):
        def warpper(*args, **kwargs):
            hasreturn =  fun(*args, **kwargs)
            return hasreturn
        return warpper
    

    这段代码和上述的第二个例子唯一不同的地方就是不定数目的参数可以让这个装饰器适用于各种方法,而不是仅仅局限于参数a, b两个入参的方法中

    3, 装饰方法也带有参数
    这种情况,主要是用于当我们适用装饰器的时候,比如上述第二个例子中,我们通过内部+1的方式,让a, b都加1, 可是如果我想在另外一个地方实现+2?怎么办?这个时候又是一种参数化,

    def decorater(num):
        def args_kwargs(fun):
            def warpper(a, b):
                a = a + num
                b = b + num
                hasreturn = fun(a, b)
                return hasreturn
            return warpper
    

    经过一番讲解,不知道看文章的你是否知道装饰器的概念和基本的使用了呢?

    相关文章

      网友评论

          本文标题:python_装饰器篇(基础理解)

          本文链接:https://www.haomeiwen.com/subject/tgmsyctx.html