【python】闭包与装饰器

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

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


# 闭包

结构组成;


【python】闭包与装饰器_第1张图片
闭包

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

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

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

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

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

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

call_fun = set_fun(test)

call_fun() 


【python】闭包与装饰器_第2张图片
源代码截图

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


【python】闭包与装饰器_第3张图片
运行结果

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


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


【python】闭包与装饰器_第4张图片
演变2

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


#终版

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

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

【python】闭包与装饰器_第5张图片
装饰器

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

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


【python】闭包与装饰器_第6张图片
万能装饰器

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

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

#  1. 无参,无返回

#  2. 无参,有返回

#  3. 有参,无返回

#  4. 有参,有返回

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


# 总结;

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

你可能感兴趣的:(【python】闭包与装饰器)