以我自己的理解,讲 闭包和装饰器

今天呢,学习的过程中用到了 装饰器,并且依照情况来看,以后会经常用到装饰器,so,现在写篇博客,回忆一下之前 Python中学到过的 闭包和装饰器的知识点。

下面,有几个问题需要进行思考:

问题【1】什么是闭包 ?
问题【2】闭包 和 普通函数有什么区别,闭包有什么用 ?
问题【3】闭包 和 面向对象 以及 匿名函数和函数 有什么不同 ?
问题【4】什么是装饰器,装饰器里有哪些知识点 ?

问题【1】:什么是闭包?

闭包呢,我的理解:
通俗的讲,闭包是这样一个东西 —— 这个东西拥有 一个空间,这个空间里放着完成某一功能需要的函数,以及 完成这个函数的调用 过程中需要的参数。
闭包则呢们用呢 ?
这里我总结了两段话
【1】函数嵌套函数
【2】外部函数返回内部函数
当你调用它的时候,你所得到的,是这个空间里面所有的东西,即空间里面的函数以及函数运行所需要的参数你都拥有了。
还不明白?给你一个 demo 再理解理解:
在这里插入图片描述

问题【2】:闭包 和 普通函数有什么区别,闭包有什么用?

对于这个区别,我的理解是:

通俗的讲
函数嘛,当你拿到一个函数的引用的时候,你可以得到的是什么?你可以得到的,只有这个函数引用所指向的 函数代码,即你得到的空间里只有函数代码,没有参数,参数是你自己需要传入的。
然而闭包呢?我们来对比一下:当你拿到一个闭包的引用的时候,你能拿到什么?你拿到的也是一个指向,但是这个闭包指向的,不仅有 函数的代码,还有函数的执行所需要的参数。你拿过来直接调用就行,你不需要传入参数。

那,可能有的人会问了,那这个闭包,到底有什么用呢?

这里,以我的理解,我简略说一下,闭包有什么用!
**我们这里为了方便,先假设一个场景:这里,有一个全局变量 G**
我们先来看一下函数,此时,我让你把全局变量传入到函数里面去,so,你就传进去了。好,没问题,那么现在,我让你重新写一个函数,我需要让你传进去全局变量,然后 对全局变量加一,然后,我让你先调用这个改变全局变量的函数,然后再去调用那个不改变全局变量的函数。那么此时,你知道,前面的那个函数最后出来的结果,一定受到后面函数的影响,那么此时,就暴露出函数一个很大的缺点,太危险了,我只要某一个函数调用全局变量的时候一不小心,把全局变量改了,所有用到全局变量的函数就全完了!!!
so,看到函数这个缺点,我们来看看闭包:
还是上面那样,我让你调用闭包,把全局变量传到闭包里,然后,你在闭包里,把这个所谓的全局变量加一。然后,我再让你调用这个闭包,然后,传入全局变量,我让你在这个闭包里,把全局变量加二。然后,好了,你会看到,全局变量还是全局变量,全局变量的值没有改变,然鹅我们 调用的两次 闭包的值不同。这里,就是闭包的用处,就是闭包的好处!它可以把函数和传入的参数单独创建一个空间,你爱怎么用就怎么用,你改变的任何值,都在闭包里存着,和全局变量 没关系,相当于隔离开了。
我这样说,Are you ok?明白了吗?

问题【3】:闭包 和 面向对象 以及 匿名函数 与 函数 有什么不同 ?

不扯淡,立即进入正题:

首先,咱先把 面向对象和闭包的区别先放一放,把最简单的 匿名函数和函数的 区别说一说
Python中的匿名函数,特别的简单,举个例子:filter(lambda x: x>20, [10,20,30])它的返回值是[30],有兴趣自己去研究 filter函数,确实挺有意思。这里呢,我就不多说了,奔主题,看区别。
首先,匿名函数,很简单,他的返回值直接就是一个结果,当你用匿名函数作为实参调用的时候,会非常的方便。那么,想一下,上面 匿名函数实现的功能,函数要怎么实现呢?这里就不说了,反正容易实现,但是代码相对来说,太多。这就是函数和 匿名函数的区别,函数可以实现很复杂的功能,匿名函数只能实现简单的功能,当实现的功能很简单的时候,没必要再去定义一个函数,此时用匿名函数很方便。
下面,我们说一下 闭包和面向对象又有什么不同呢?
上面几个例子,我们认识到,闭包,把函数代码和所需要的参数封装在一起,形成一个独立的空间。那么 面向对象呢?面向对象也是这样,把函数和所需要的参数封装在一起,我们把这个东西叫做类。然后嘞?区别呢?
区别就是!当你拿到一个类,对这个类进行实例化的时候,你的得到的,除了你完成某一功能所需要的函数以外,还白白给你加了几个对你来说没用的函数,也就是说,当你拿到一个对象的时候,你把需要的,不需要的全都得到了。这就是面向对象 和 闭包的区别!即,闭包封装起来的,是对你来说有用的函数和参数,而类,把所有的你用得到的,用不到的都封装起来了,当你实现的功能很简单的时候,就没必要要用面向对象,因为,它占的空间大。当然,也是这样,都有优缺点嘛,你闭包不能完成 大的工程,然而面向对象却可以!!!

问题【4】什么是装饰器 ?

通俗的讲,装饰器就是一个函数,只不过呢,这个函数可以在你原来某个函数拥有的功能的基础上,再给你的函数增加新的功能。他的写法,是建立在闭包之上的。咱知道,闭包是函数嵌套函数,外部函数返回内部函数,只不过呢,装饰器,它给你的闭包,闯入的参数,是一个函数的引用,并且,内部函数的返回值,是你装饰器装饰的函数。这里,写一个 Demo理解一下。在这里插入图片描述
我们看到,在没有调用装饰器装饰的函数之前,装饰器的装饰功能就已经开始执行了,并且我们看到,装饰器是从整个屏幕由上到下执行的,等到它执行完了一遍,装饰器装饰的函数才开始被执行,然后此时,装饰器内部函数有了返回值,返回给外部函数。
其实这里呢,还有一个知识点:装饰器的执行顺序——
当装饰器装饰函数的时候,遇到两个装饰器同时装饰同一个函数,装饰器装饰的顺序是,从下往上执行,即先执行下面的装饰器进行装饰,上面的装饰器才开始装饰。
装饰器执行顺序呢,即装饰器里面函数执行顺序呢,正好和装饰顺序反过来。
不过多解释,挺简单,比较容易想到。
其实呢,装饰器还有很多种分类,比如说:类装饰器,带参数的装饰器,通用装饰器。。。。。
装饰器呢,也就这么多内容,知道是什么,明白装饰器是怎怎么工作的就行,遇到具体情况搬出来用就行,不细说了。

发布了36 篇原创文章 · 获赞 75 · 访问量 5453

猜你喜欢

转载自blog.csdn.net/weixin_44449518/article/details/98965761