# 本次讲述的知识点也是非常重要的(严肃脸)
# 先有的闭包,之后才生成了装饰器,同样的也是非常简单的东西。
# 闭包
结构组成;
闭包写法;外层函数返回内层函数的引用,外层函数必须要有参数!
作用;执行函数的时候我们可以把外层函数的参数保存在内存中!
# 具体是如何演化成装饰器的呢?
我记得当初学习装饰器的时候,样哥讲装饰器就是表面意思,等于就是在一个事物上添加附加条件的过程,所以装饰器在工作上运用的蛮多的,简单易用!(有点废话~~)
现在我们说说装饰器的演变过程;
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. 有参,有返回
而且,在道德上我们是不会更改函数的值和调用方式的,以上四种情况我在这就不说明了,别人应该写的比我更好,本次只是简述了闭包和装饰器的生成过程!
# 总结;
生命有限,重在珍惜!时间更是越用越少,学习成为生命有意义的体现,更多的是满足自己的精神世界,每天分享的东西不多,但只要一直学习,便不会孤独!
网友评论