一文读懂Python装饰器

一文读懂Python装饰器,第1张

谈装饰器前,还要先要明白一件事,Python 中的函数和 JavaC++++不太一样,Python 中的函数可以像普通变量一样当做参数传递给另外一个函数,例如:

一文读懂Python装饰器,一文读懂Python装饰器,第2张

一文读懂Python装饰器,一文读懂Python装饰器,第3张

先来看一个简单例子,虽然实际代码可能比这复杂很多:

一文读懂Python装饰器,一文读懂Python装饰器,第4张

现在有一个新的需求,希望可以记录下函数的执行日志,于是在代码中添加日志代码:

一文读懂Python装饰器,一文读懂Python装饰器,第5张

一文读懂Python装饰器,一文读懂Python装饰器,第6张

一文读懂Python装饰器,一文读懂Python装饰器,第7张

一文读懂Python装饰器,一文读懂Python装饰器,第8张

简单装饰器

一文读懂Python装饰器,一文读懂Python装饰器,第9张

一文读懂Python装饰器,一文读懂Python装饰器,第10张

@ 语法糖

一文读懂Python装饰器,一文读懂Python装饰器,第11张

一文读懂Python装饰器,一文读懂Python装饰器,第12张

一文读懂Python装饰器,一文读懂Python装饰器,第13张

*args、**kwargs

可能有人问,如果我的业务逻辑函数 foo 需要参数怎么办?比如:

一文读懂Python装饰器,一文读懂Python装饰器,第14张

我们可以在定义 wrapper 函数的时候指定参数:

一文读懂Python装饰器,一文读懂Python装饰器,第15张

一文读懂Python装饰器,一文读懂Python装饰器,第16张

一文读懂Python装饰器,一文读懂Python装饰器,第17张

一文读懂Python装饰器,一文读懂Python装饰器,第18张

一文读懂Python装饰器,一文读懂Python装饰器,第19张

比如:

一文读懂Python装饰器,一文读懂Python装饰器,第20张

这时,你就可以把 wrapper 函数指定关键字函数:

一文读懂Python装饰器,一文读懂Python装饰器,第21张

带参数的装饰器

一文读懂Python装饰器,一文读懂Python装饰器,第22张

一文读懂Python装饰器,一文读懂Python装饰器,第23张

一文读懂Python装饰器,一文读懂Python装饰器,第24张

@use_logging(level=“warn”)等价于@decorator

类装饰器

一文读懂Python装饰器,一文读懂Python装饰器,第25张

一文读懂Python装饰器,一文读懂Python装饰器,第26张

functools.wraps

一文读懂Python装饰器,一文读懂Python装饰器,第27张

例子:

一文读懂Python装饰器,一文读懂Python装饰器,第28张

一文读懂Python装饰器,一文读懂Python装饰器,第29张

一文读懂Python装饰器,一文读懂Python装饰器,第30张

装饰器顺序

一个函数还可以同时定义多个装饰器,比如:

一文读懂Python装饰器,一文读懂Python装饰器,第31张

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2717892.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-17
下一篇 2022-08-17

发表评论

登录后才能评论

评论列表(0条)

保存