美文网首页【python】初学者
【python】闭包与装饰器

【python】闭包与装饰器

作者: 米兰的小铁匠 | 来源:发表于2018-05-24 13:35 被阅读93次

    # 本次讲述的知识点也是非常重要的(严肃脸)

    # 先有的闭包,之后才生成了装饰器,同样的也是非常简单的东西。


    # 闭包

    结构组成;

    闭包

    写法;外层函数返回内层函数的引用,外层函数必须要有参数!

    作用;执行函数的时候我们可以把外层函数的参数保存在内存中!

    # 具体是如何演化成装饰器的呢?

    我记得当初学习装饰器的时候,样哥讲装饰器就是表面意思,等于就是在一个事物上添加附加条件的过程,所以装饰器在工作上运用的蛮多的,简单易用!(有点废话~~)

    现在我们说说装饰器的演变过程;

    1. 我们先定义一个闭包,外层函数set_fun()与内层函数call_fun(),外层函数传入参数func,内层函数调用func(),另外在闭包外创建text()函数,打印text。这个时候我们已经差不多写完了整个程序了,就剩下最后的执行步骤,我们可以先想一个问题,装饰器是来添加附加东西的,所以我们可以简单的在闭包里的内层函数添加一些东西,这里我们就打印“权限”来代表添加的东西(毕竟装饰器的初衷就是如此),接下来我们来使两者联系并且执行起来;

    call_fun = set_fun(test)

    call_fun() 

    源代码截图

    这样,整个程序就都联系起来了,运行后会发现在输出的text之上加了一个权限两字,对!就是我们刚刚添加的!棒棒哒!附图;

    运行结果

    #话说,其实这个时候我们已经完成了装饰器的功能,等等!这还是装饰器的最初形态,我们还可以将其变得更简洁,更好~~~往下翻~


    2.  演变第二部,我们只需把执行代码行的call_fun 改成 text~~~~嗯?改变不大?对,是的,改变不大,别慌,我们还有演变最终版呢!这个过渡很重要的; 

    演变2

    # 功能还是那个功能,结果还是那个结果!这其中其实是有一个指向问题,1中的text指向是call_fun ,而现在这一层指向是经过call_fun后又指向了func,这个时候text()=func(),双层指向更能直观的显示我们的所需要的目的!最终版要来咯~~~


    #终版

    # 这最终版就叼了,简直瑟瑟发抖~~~哈哈,不皮了~~

    #这其中要运用到一个叫做语法糖的东西,顾名思义就是粘住你(这里是函数),在函数前添加 @+闭包外层函数名,就形成了我们最终版的装饰器;

    装饰器

    #语法糖的出现就减去了一行调用代码,代码优化还是很明显的!之后再执行函数就行了,完全不用管装饰器,已经自动执行了。就如图所示,在函数前加入语法糖就行(@set_fun==》text = set_fun(text)  )

    # 到这里,我们就明白了装饰器的功能的同时,又理解了其中的调用过程,没有什么技术性的东西,全都是一些固定的用法,所以我们就可以做一个万能装饰器,完全不用我们去我们编写装饰器那种,嘿嘿;

    万能装饰器

    #一般来说,装饰器涉及了很多种情况;

    # 装饰我们的函数分为四组情况

    #  1. 无参,无返回

    #  2. 无参,有返回

    #  3. 有参,无返回

    #  4. 有参,有返回

    而且,在道德上我们是不会更改函数的值和调用方式的,以上四种情况我在这就不说明了,别人应该写的比我更好,本次只是简述了闭包和装饰器的生成过程!


    # 总结;

    生命有限,重在珍惜!时间更是越用越少,学习成为生命有意义的体现,更多的是满足自己的精神世界,每天分享的东西不多,但只要一直学习,便不会孤独!

    相关文章

      网友评论

        本文标题:【python】闭包与装饰器

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