一、什么是装饰器
装饰器(decorators)是 Python 中的一种高级功能,它允许你动态地修改函数或类的行为,它接受一个函数作为参数,并返回一个新的函数或修改原来的函数。(资料解释来自于菜鸟编程)
单单看上述的概念可能会有点抽象,不利于我们对这个的理解。可以尝试换一种思路去理解这句话每个人都会有许多的装饰物,比如耳环、帽子、墨镜、口罩等,这些物品带上之后可以让我们看起来更加的漂亮,起到装饰的作用,但是又不会影响我们人正常的生活,转换思想,装饰器 -> 饰品、人 -> 函数,也就是说,装饰器的作用是在给对应的函数本身的基础上做修饰,并不会影响到函数本身功能的执行。(相当于函数被强化了!!!)
二、装饰器怎么用
直接上一个标准的模板函数
def wrapper(func):
def inner(*args,**kwargs):
res = func(*args,**kwargs)
return res
return inner
1、func参数是什么?
答:这个是一个形参,这个形参会以函数的形式传递进来,也就是“被修饰的函数”,可以理解为即将被强化的函数。
2、为什么要在内部定义一个函数inner?
答:保存局部信息不被销毁,保证数据的安全性,本质上的修饰器就是一个闭包函数,关闭什么闭包函数呢,这个可以网上查询一下,或者想了解的在评论区留言。
3、*args和**kwargs是什么?是必要的嘛?
答:*args参数,名称可以叫*arrr、*ddd等,主要是前面的*号,一个*号代表这个参数可以接收不定数量的参数,最后是以元组的形式放在一起的。
**kwargs参数,名称也是可以随便取的,前提是在规范的范围内比较好,两个**号代表这个参数可以接收不定数量的键值对形式的参数,最后作为参数传给函数,以字典的形式将参数放在一起的。(【Python】`*args` 和 `**kwargs`的用法【最全详解】_(**kwargs)-优快云博客,这个大佬有更全面的解答)
用这两种参数格式,基本可以包含大部分的参数形式,也就意味着我们写的装饰器可以应用在非常多的函数上,可以兼容不同格式、不同数据类型的参数。(可以理解为,这顶帽子,谁都能戴)
最主要的解析就这些了,最后执行调用传进来的参数,再将结果返回,最后返回整个装饰器的运行结果。
4、实例演示
现在我们用一个实际的例子来写一个装饰器,整个装饰器用于函数的执行日志打印。
def log(func):
def wrapper(*args,**kwargs):
print(“{}函数开始执行”.format(func.__name__))
func(*args,**kwargs)
print("执行结束")
return wrapper
这个函数很熟悉吧,和我们的模板函数其实差不多一样,接下来我们随便写一个测试函数
def test():
print("测试用")
这两个函数目前看来是毫无关联的,我们需要将他们结合起来,将“帽子戴在人身上”,重新写一遍测试函数
@log
def test():
print("测试用")
现在调用这个test函数,就会打印装饰器里面的内容了
以上就是装饰器的概念理解和初步应用。
三、装饰器的其他作用
装饰器除了日常打印外,还可用于函数的执行时间计算,事务处理、权限校验、缓存等。
小结
装饰器在python当中扮演很重要的角色,个人最近正在学习相关的知识点,以此将自己总结的分享出来,和大家一起交流,若有出现错误或者解释模糊的地方,烦请指出。