1.一个函数内部嵌套另外一个函数;
2.内部函数使用了外函数的非全局变量(包括外函数传入的参数);
3.外函数的retune返回的是内函数的函数名;
例:
以上函数就是一个闭包函数,如果内函数使用了变量a,那就不是闭包;
二,闭包的原理:如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。
这个原理非常重要,这就能帮助我们实现装饰器,在不改动原函数的基础上扩展功能;
我们已经实现了一个index函数返回网站首页,但是我们后面新加一个需求是在返回首页之前让用户先登录,那我们就可以写一个装饰器login,再在原函数上加一个帽子@login就实现了原功能的扩展,并且没有修改原函数,这里可以引入一个概念,开放封闭原则;
开放封闭原则(Open-Closed Principle):一个软件实体应当对扩展开放(open),则修改关闭(不修改原来的代码这就是closed)。在设计一个模块时,应当使得这个模块可以在不被修改的前提下被扩展。
装饰器是将原来的函数当参数传到外函数,内函数实现扩展功能;
结果:
不带参数的装饰器,(原函数没有参数)如下
以上装饰器是一个函数运行计时的,原函数没有参数;
原函数带参数,那我们的装饰器函数也需要传参;如下
如下我们把装饰器的参数改为不定长参数,那么不管原函数有几个参数或者没有参数,我们的装饰器都是通用的,如下:
1.函数实现装饰器,是把原函数当做函数传参传递,那么类装饰器接收参数的话就得用__init__接收;
2.类实现装饰器,需要依赖__call__方法,前后下划线的方法在python中被称为魔术方法,是一类不需要主动调用,只在触发的时候自动执行的方法,那call方法就是在当类被调用的时候会自动执行,依赖这个原理,我们可以实现类装饰器;如下:
其中2和3两个装饰器在类和对象的的时候应该使用过,就不做过多介绍了
特性装饰器:@property
类方法装饰器: @classmethod
静态方法装饰器:@staticmethod



