一、闭包
1、什么是闭包
闭包是一种特殊的函数,同时满足以下条件的函数就是闭包函数:
- 函数内部定义了一个函数
- 外部函数的返回值是内部函数
- 外部函数的参数是一个函数(需要被增强功能的函数)
【表示形式】
def 闭包函数名(需要被增强的函数名):
局部变量 #可有可无
def 内部函数名(参数列表):
前增强内容
调用需要被增强的函数
后增强内容
return语句 #可有可无
return 内部函数名
2、为什么要用闭包(优势)
- 可以延长外部函数中局部变量的生命周期
- 以可控的方式使用该变量(相当于实现私有化)
- 在不改变原有函数功能的基础上,对齐进行了增强
- 实现功能解耦,有利于代码维护和复用
3、闭包的底层逻辑
面向切面编程+动态代理
二、语法糖
1、什么是语法糖
泛指方便好用的、更容易表达某操作的语法,具有以下特点:
- 没有增加语言的功能,但让其更好使用
- 不影响原有语言的功能
2、为什么要增加语法糖
- 方便程序员编程
- 提高代码可读性
三、装饰器
1、什么是装饰器
装饰器就是一种特殊函数,借助闭包函数+语法糖来实现
【表示形式】
@装饰器名
def 需要被增强的函数名(参数列表):
函数体
def 装饰器名(函数名f): #一个装饰器对应一个闭包函数
def 内部函数(*args,**kwargs):
增强逻辑+调用函数名f()
return f的返回值
return 内部函数名
- 类似于java中的注解
2、为什么要用装饰器
- 代码解耦(业务逻辑、不同增强功能逻辑相分离),提高其可维护性和可复用性
- 增强业务逻辑功能
- 便捷开发
3、装饰器执行流程
1)当一个函数上面增加了多个装饰器时,执行顺序
@装饰器1
@装饰器2
@装饰器3
def 业务函数名(arg):
pass
-
由上到下(从最上面的那个装饰器开始),依次将上一次的封装结果整体作为下一次封装的输入进行封装
-
由外向内(从封装的最外层),一次嵌套调用装饰器进行执行
4、装饰器底层逻辑
- 面向切面编程
- 装饰器设计模式(功能的增加逻辑)+动态代理设计模式(增强业务代码的逻辑)