一篇文章搞懂装饰器所有用法(建议收藏)
对于每一个学习 Python 的同学,想必对 @
符号一定不陌生了,正如你所知, @ 符号是装饰器的语法糖,@符号后面的函数就是我们本文的主角:装饰器。
装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上。和这个函数绑定在一起。在我们调用这个函数的时候,件事并不是执行这个函数,而是将这个函数做为参数传入它头顶上这顶帽子,这顶帽子我们称之为 装饰器
。
曾经我在刚转行做程序员时的一次的面试中,被面试官问过这样的两个问题:
1、你都用过装饰器实现过什么样的功能?
2、如何写一个可以传参的装饰器?
对于当时实战经验非常有限的我,个问题只能回答一些非常简单的用法,而第二个问题却没能回答上来。
当时带着这两个问题,我就开始系统的学习装饰器的所有内容。这些一直整理在自己的博客中,今天对其进行了大量的补充和勘误,发表在这里分享给大家。希望对刚入门以及进阶的朋友可以提供一些参考。
01. 装饰器语法糖
如果你接触 Python 有一段时间了的话,想必你对 @
符号一定不陌生了,没错 @
符号就是装饰器的语法糖。
它放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上。和这个函数绑定在一起。在我们调用这个函数的时候,件事并不是执行这个函数,而是将这个函数做为参数传入它头顶上这顶帽子,这顶帽子我们称之为装饰函数
或 装饰器
。
你要问我装饰器可以实现什么功能?我只能说你的脑洞有多大,装饰器就有多强大。
装饰器的使用方法很固定:
- 先定义一个装饰函数(帽子)(也可以用类、偏函数实现)
- 再定义你的业务函数、或者类(人)
- 后把这顶帽子带在这个人头上
装饰器的简单的用法有很多,这里举两个常见的。
- 日志打印器
- 时间计时器
02. 入门用法:日志打印器
首先是日志打印器。 实现的功能:
在函数执行前,先打印一行日志告知一下主人,我要执行函数了。 在函数执行完,也不能拍拍屁股就走人了,咱可是有礼貌的代码,再打印一行日志告知下主人,我执行完啦。
# 这是装饰函数
def logger(func):
def wrapper(*args, **kw):
print('我准备开始计算:{} 函数了:'.format(func.__name__))
# 真正执行的是这行。
func(*args, **kw)
print('啊哈,我计算完啦。给自己加个鸡腿!!')
return wrapper
相关文章