欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python开发中的装饰器及闭包使用

程序员文章站 2024-01-19 09:36:34
装饰器是一种特殊的闭包功能:1、额外增加功能 2、函数执行时间统计3、执行函数的时候需要进行的预处理 4、权限校验等5、缓存6、日志 (后三个重点)1、标识符的查找顺序 L>E>G>BL(local) E G BL —— Local(function);函数内的名字空间E —— Enclosing function locals;外部嵌套函数的名字空间(例如closure)G —— Global(module);函数定义所在模块(文件)的名字空间B —— Built...

装饰器是一种特殊的闭包

功能:1、额外增加功能 2、函数执行时间统计3、执行函数的时候需要进行的预处理 4、权限校验等5、缓存6、日志 (后三个重点)

1、标识符的查找顺序 L>E>G>B

L(local) E G B
L —— Local(function);函数内的名字空间
E —— Enclosing function locals;外部嵌套函数的名字空间(例如closure)
G —— Global(module);函数定义所在模块(文件)的名字空间
B —— Builtin(Python);Python内置模块的名字空间

2、闭包

def func2(): def func1(): print('我是嵌套在func2里面的func1') return func1 if __name__ == '__main__': ret = func2() print(ret) ret() 

python开发中的装饰器及闭包使用
定义:一个函数嵌套另外一个函数,如果内部的函数使用到了外面的变量
应用:在代码重复比较多的时候 2在已完成的代码的基础上添加一些新的功能时
****注意点:
1、闭包的格式:
def 外部函数():
-----def 内部函数():
----------内部函数体
-----return 内部函数的引用

2、外部函数返回的是内部函数的引用,引用不能加()。加了()是调用。引用相当于赋值,地址的传递
3、闭包容易存在的问题,消耗内存****

装饰器例子

def wrapper(func): def inner(): # 第一验证  验证是否登录 # 第二验证  验证是否具有权限 print(func) func() return inner
@wrapper def ordering(): # 第一验证  验证是否登录 # 第二验证  验证是否具有权限 # checkpwd() # checkauth() print('------正在下订单-------------') @wrapper def changepwd(): # 第一验证  验证是否登录 # 第二验证  验证是否具有权限 # checkpwd() # checkauth() print('-----------修改密码----------') # def showinfo(): #     # 第一验证  验证是否登录 #     # 第二验证  验证是否具有权限 #     # checkpwd() #     # checkauth() # #     print('---------个人信息------------') if __name__ == '__main__': func = wrapper(changepwd) #给参数 func() # changepwd() 

输出:

<function wrapper.<locals>.inner at 0x00000270FE76A550> <function changepwd at 0x00000270FE76A4C0> -----------修改密码---------- 

多层装饰

python开发中的装饰器及闭包使用

注意点:

结合性:装饰的过程 执行性:执行的过程
1、多层装饰,装饰的顺序是自下而上 (结合性)
2、执行的顺序是自上而下
有多个装饰器的时候执行顺序是由近到远, 在函数调用的时候, 从远--》近--》函数--》近--》远

带参数的函数的装饰

python开发中的装饰器及闭包使用

注意点:
1、如果当前被装饰的函数不存在参数,随便写
2、如果被装饰的函数存在参数,在装饰器的内层函数中进行传参
3、在内层函数中执行被装饰的函数,记得传参

不定长参数的函数装饰

python开发中的装饰器及闭包使用

注意点:
1、args打包成元组,kwargs打包成字典

还有一个装饰器工厂函数

python开发中的装饰器及闭包使用

注意点:
1、装饰器工厂函数,可以根据选择参数,返回不同的装饰器
2、所以,最外层函数的返回值,一定是装饰器的引用
3、在调用的过程中,@最外层函数(实参),创建装饰器

本文地址:https://blog.csdn.net/weixin_44270211/article/details/108245262