Ⅰ 闭包函数
闭包函数=函数嵌套定义+函数对象+名称空间作用域
闭:指的是该函数是定义再一个函数内部的函数
包:指的是该函数访问了一个来自于外层函数的变量
为函数体传参:直接使用参数传参;把函数体想要的参数包给他
Ⅱ 装饰器
什么是装饰器:器=工具;装饰:为被装饰者添加额外的功能
为什么要用装饰器:软件一旦上线运行之后,就应该遵循开放封闭原则:开放指的是对拓展新功能开放;封闭指的是对修改源代码封闭
Ⅲ 如何使用装饰器
首先选定被装饰器对象

为函数index添加功能
方案Ⅰ: 直接修改源代码为函数index添加新功能

方案Ⅱ : 找到所有调用index的位置,然后添加代码

方案Ⅲ : 把装饰器写入一个函数内

方案Ⅳ : 把装饰器wrapper内的函数index修改成参数的形式

方案Ⅴ : 基于闭包函数把wrapper函数想要的参数传给他,然后基于函数对象把闭包函数wrapper返回到全局,赋值给原函数名

方案Ⅵ : 在上一个方案的基础上增加 * args 和 ** kwargs 来把wrapper的参数伪装

方案Ⅶ : 在⑥的基础上使wrapper函数和返回值保持一致

方案Ⅷ : 在⑦的基础上加上装饰器语法符号@

网友评论