Ⅰ 闭包函数
闭包函数=函数嵌套定义+函数对象+名称空间作用域
闭:指的是该函数是定义再一个函数内部的函数
包:指的是该函数访问了一个来自于外层函数的变量
为函数体传参:直接使用参数传参;把函数体想要的参数包给他
Ⅱ 装饰器
什么是装饰器:器=工具;装饰:为被装饰者添加额外的功能
为什么要用装饰器:软件一旦上线运行之后,就应该遵循开放封闭原则:开放指的是对拓展新功能开放;封闭指的是对修改源代码封闭
Ⅲ 如何使用装饰器
首先选定被装饰器对象
调用函数后,运行到time.sleep时,等待2秒再运行print程序为函数index添加功能
方案Ⅰ: 直接修改源代码为函数index添加新功能
问题: 在源代码内添加代码方案Ⅱ : 找到所有调用index的位置,然后添加代码
问题: 红线内为在index调用的位置添加的代码,如果有多个index调用位置,就需要添加多少个代码方案Ⅲ : 把装饰器写入一个函数内
问题: 装饰器被写死了,只能装饰index函数方案Ⅳ : 把装饰器wrapper内的函数index修改成参数的形式
问题: 原函数index的调用是在全局空间,修改后的调用的方式是wrapper(index),这修改了函数的调用方式方案Ⅴ : 基于闭包函数把wrapper函数想要的参数传给他,然后基于函数对象把闭包函数wrapper返回到全局,赋值给原函数名
问题: 调用的index的参数被写死了,无法进行其他参数传值方案Ⅵ : 在上一个方案的基础上增加 * args 和 ** kwargs 来把wrapper的参数伪装
问题:返回值与原函数不一致方案Ⅶ : 在⑥的基础上使wrapper函数和返回值保持一致
问题: 函数不够简洁,看着比较杂乱方案Ⅷ : 在⑦的基础上加上装饰器语法符号@
end
网友评论