在函数内部再定义一个函数,内部函数用到了外边函数的变量,并且外部函数将内部函数的引用 返回,那么将这个函数以及用到的一些变量称之为闭包 例如:
当在一个嵌套的函数中对变量申明为nonlocal时,就明确表示这个变量是外部函数中定义的变量
可以进行修改
闭包优化了变量,原来需要类对象完成的工作,闭包也可以完成 由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存。
装饰器的作用:在不改变原对象的情况下给原对象增加功能 装饰器由闭包和语法糖组成。
如
一般修饰函数的时候闭包外面的函数参数为你要修饰的函数,闭包里面的函数的参数为你要修饰的函数的参数,闭包里面的函数为你要修饰的内容跟上自己要修饰的函数接着跟上要修饰的东西。
修饰函数也有语法糖如;
总结 语法糖 先写闭包在写修饰的函数,别修饰的函数要加上@闭包函数名
最后调用要修饰的函数
多重修饰函数如:
注意:多层修饰时先进入外层函数第一层在进内层函数等内层函数运行完在进入最外层函数运行结果如下:
函数修饰类
注意:因为修饰的是实例化函数闭包函数内层需要加入self变量。
运行结果如下:
类方法修饰类方法如下图:
基本上与函数修饰类一样注意的是调用时用的为类方法。运行结果如下:
函数在修饰时传入参数:
如图所示 当修饰函数传入参数后 调用函数时就不需要在调用函数了 结果如下:
用类来修饰类:
如图切记函数里面的形参为类,getattr(类名,属性名)函数为返回类的某一属性。
__getattr__(self,item)为返回类里面没有的属性
结果如下:
用类来修饰函数:
结果如下
注意类修饰函数时没有返回值