美文网首页
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_装饰器篇(基础理解)

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

  • python_装饰器

    ```python def all(func, *argv): def run(): print('i am ru...

  • python_装饰器

    装饰器(decorator)功能引入日志函数执行时间统计执行函数前预备处理执行函数后清理功能权限校验等场景缓存

  • python_装饰器篇(多个装饰器下的执行顺序)

    在之前的帖子中,简单自我总结了装饰器的几个情况以及基本上使用,那么有基本上说的都是单个的装饰器修饰方法 有时候我们...

  • Python装饰器(Decorator)完全指南-进阶篇

    Decorator进阶指南 在[python装饰器完全指南基础篇中],我们已经知道了python中的装饰器本质上只...

  • Python_闭包、装饰器

    闭包 内部函数调用外部函数的变量(一个闭包就是你调用的一个函数A,这个函数A返回一个函数B给你。这个返回的函数B就...

  • TypeScript基础入门之装饰器(三)

    转载 TypeScript基础入门之装饰器(三) 继续上篇文章[TypeScript基础入门之装饰器(二)] 访...

  • Python基础 装饰器

    装饰器 python装饰器个人的理解: 在原本函数基础上,在不改变原函数名和原函数代码的情况下,增加对这个函数的的...

  • Python中的Decorator装饰器

    Decorator 装饰器 理解decorator(装饰器)的关键, 在于理解在python中函数是第一公民, 并...

  • 装饰器五部曲

    听说你学不会装饰器?Python基础之装饰器五部曲,带你轻轻松松学会装饰器 装饰器(decorator)是Pyth...

网友评论

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

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