一、python装饰器本质
一言以蔽之:函数闭包的语法糖
增强一个函数的三种方式:
1,普通增强
def 主函数():
print("主函数逻辑")
def 增强函数(函数):
print("增强函数开始逻辑")
函数()
print("增强函数结束逻辑")
def 调用():
增强函数(主函数)
2,用闭包函数增强
def 主函数():
print("主函数逻辑")
def 增强调用函数(函数):
def 增强实现函数():
print("增强函数开始逻辑")
函数()
print("增强函数结束逻辑")
return 增强实现函数
def 调用():
已增强函数 = 增强调用函数(主函数)
已增强函数()
3、用装饰器增强
@增强调用函数
def 主函数():
print("主函数逻辑")
def 增强调用函数(函数):
def 增强实现函数():
print("增强函数开始逻辑")
函数()
print("增强函数结束逻辑")
return 增强实现函数
def 调用():
主函数()
1、什么是闭包函数?
- 函数式语言(函数是一等公民,可作为变量使用)中的术语
- 函数闭包:一个函数,其参数和返回值都是函数
- 用于增强函数功能
- 面向切面编程(AOP)
# 闭包本质上是一个函数
# 闭包函数的传入参数和返回值也都是函数
# 闭包函数的返回值函数是对传入函数进行增强后的结果
def count_time_wrapper(func):
def improved_func():
start_time = time.clock()
func()
end_time = time.clock()
return improved_func
2、什么是语法糖?
- 指计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用。
- 语法糖没有增加新功能,只是一种更方便的写法
- 语法糖可以完全等价地转换为原本非语法糖的代码
- 装饰器在第一次调用被装饰函数时进行增强
- 增强时机?在第一次调用之前
- 增强次数?只增强一次
二、 有返回值或输入参数怎么增强?
抛出两个问题
- 对于含有返回值的函数,调用闭包增强后,不能成功返回,但是成功增强了辅助功能
- 对于含有参数的函数,调用闭包增强后,不能成功接收参数
1、解决返回值问题
def 主函数():
print("主函数逻辑")
return 返回值
def 增强调用函数(函数):
def 增强实现函数():
print("增强函数开始逻辑")
返回值 = 函数()
print("增强函数结束逻辑")
return 返回值
return 增强实现函数
def 调用():
已增强函数 = 增强调用函数(主函数)
已增强函数()
1、解决传参问题
def 主函数():
print("主函数逻辑")
return 返回值
def 增强调用函数(函数):
def 增强实现函数(*args,**kwargs): #增强函数应把接收到所有函数传给原函数
print("增强函数开始逻辑")
返回值 = 函数(*args,**kwargs)
print("增强函数结束逻辑")
return 返回值
return 增强实现函数
def 调用():
已增强函数 = 增强调用函数(主函数)
已增强函数()
三、多个装饰器的执行顺序
@wrapper1
@wrapper2
def func():
pass
----- 执行顺序👇
wrapper1
wrapper2
func
wrapper2
wrapper1
----- 等价于👇
func = wrapper2(func)
func = wrapper1(func)
网友评论