一、装饰器含义
-
python的装饰器
本质
上是一个Python函数。 -
它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
-
简单的说装饰器就是一个用来返回函数的函数。
-
它经常用于一些场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。
-
概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
二、为什么需要装饰器
- 一个简单的例子
- 需求增加
- 可以记录下函数的执行日志
- 又有增加需求
- 有100个函数需要增加这个需求,并且后续可能还要对这一百个函数增加执行前打印日志
- 运行结果
三、装饰器使用方法
- 先定义一个装饰函数(帽子)(也可以用类实现)
- 再定义业务函数、或者类(人)
- 最后把这顶帽子戴在这个人头上
四、装饰器使用场景
1. 装饰器入门:日志打印器
- 日志打印器,它要实现的功能:
- 在函数执行前,先打印一行日志告知一下,要执行函数了。
- 在函数执行完,也不能什么反应也没有,再打印一行日志告知下,执行结束了。
- 运算结果
- 代码
def logger(func):
def wrapper(*args, **kw):
print("我准备开始计算:{}函数了: ".format(func.__name__))
# 正在执行的时这行
func(*args, **kw)
print("wc,算完了。来根儿鸡腿!!")
return wrapper
@logger
def add(x, y):
print("{} + {} = {}".format(x, y, x+y))
add(200, 100)
2. 装饰器进阶:带参数的函数装饰器
-
实例:
-
两个函数的执行的时候,分别根据其国际,来说出一段打招呼的话。
-
实例
-
在给他们俩戴上装饰器的时候,就要跟装饰器说,这个人是哪国人,然后装饰器就会做出判断,打出对应的招呼。戴上帽子后,如上图。
-
实例
-
万事俱备,只差帽子。来定义一下,这里需要两层嵌套。如上图。
-
执行一下:
-
完整函数
3.装饰器高阶:不带参数的类装饰器
- 基于类装饰器的实现,必须实现
__call__
和__init__
两个内置函数。 __init__
:接收被装饰函数__call__
:实现装饰逻辑
- 带参数和不带参数的类装饰器有很大的不同。
__init__
:不再接收被装饰函数,而是接收传入参数__call_
:接收被装饰函数,实现装饰逻辑。