Python - 闭包和装饰器
一、闭包
1. 闭包的概念与使用
定义:在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包
作用:可以保存外部函数内的变量,不会随着外部函数调用完而销毁
优点:提高代码的可重用性,不需要再手动定义额外的功能函数
缺点:由于闭包引用了外部函数的变量,则外部函数的变量没有及时释放,消耗内存
形成条件
- 在函数嵌套(函数里面再定义函数)的前提下
- 内部函数使用了外部函数的变量(还包括外部函数的参数)
- 外部函数返回了内部函数
1 | # 外部函数 |
2. 修改闭包内的外部变量
- 需要使用
nonlocal
关键字来完成
1 | def func_out(name): |
二、装饰器
1. 装饰器的定义
定义作用:给已有函数增加额外功能的函数(本质上就是一个闭包函数),有且只有一个参数,且必须是函数类型
执行时间:加载模块时立即执行
功能特点
- 不修改已有函数的源代码
- 不修改已有函数的调用方式
- 给已有函数增加额外的功能
1 | # 装饰器 |
2. 装饰器的语法糖写法
语法糖的书写格式:@装饰器名字
1 | # 添加一个登录验证的功能 |
3. 各类函数的装饰器
(1)装饰带有参数的函数
1 | # 添加输出日志的功能 |
(2)装饰带有返回值的函数
1 | # 添加输出日志的功能 |
(3)装饰带有不定长参数的函数
1 | # 添加输出日志的功能 |
(4)通用装饰器
1 | # 通用装饰器 |
4. 多个装饰器的使用
- 装饰顺序:由内到外
1 | def make_div(func): |
5. 带有参数的装饰器
- 添加参数方式:在装饰器外面再包裹上一个函数,让最外面的函数接收参数,返回的是装饰器,因为@符号后面必须是装饰器实例
- 传参格式:
@装饰器(参数,...)
1 | # 添加输出日志的功能 |
6. 类装饰器的使用
- 类装饰器:装饰器的特殊用法,就是通过定义一个类来装饰函数
__call__()
:把类的实例变成可调用对象(callable),也就是说可以像调用函数一样进行调用
1 | class Check(object): |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 妙妙屋!