前言
装饰器本质上是一个Python函数。
它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,
装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。
概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能
可以与闭包的概念联合起来理解
一个简单的装饰器
无参函数装饰
以一个获取函数执行时间的装饰器为例子
import time def fnplus(fn): # 将来会传入一个函数 def f(): print("我是一个装饰器,我现在开始装饰你的函数了......") time1 = time.time() fn() print("fun 用时 %.2f" % (time.time() - time1)) return f # 将函数本身返回
调用这个装饰器
直接调用(用的少)
先定义一个简单的原函数
def fun1(): time.sleep(3) print("我是一个原函数")
fnplus(fun1)()
返回结果如下
"D:\PyCharm 2021.3.3\dtest\aliang-py\Scripts\python.exe" "D:/PyCharm 2021.3.3/aliang-py/装饰器.py" 我是一个装饰器,我现在开始装饰你的函数了...... 我是一个原函数 fun 用时 3.01
通过语法糖调用(使用较多)
先定义
@fnplus def fun1(): time.sleep(3) print("我是一个原函数")
再调用
fun1()
返回结果
"D:\PyCharm 2021.3.3\dtest\aliang-py\Scripts\python.exe" "D:/PyCharm 2021.3.3/aliang-py/装饰器.py" 我是一个装饰器,我现在开始装饰你的函数了...... 我是一个原函数 fun 用时 3.00
有参函数装饰
以一个获取函数执行时间的装饰器为例子
import time def fnplus(fn): # 将来会传入一个函数 def f(msg): print("我是一个装饰器,我现在开始装饰你的函数了......") time1 = time.time() fn(msg) print("fun 用时 %.2f" % (time.time() - time1)) return f # 将函数本身返回
以语法糖的方式装饰有参函数
@fnplus def fn1(a): time.sleep(2) print(f"我传入的参数是{a}") fn1("hello world")
调用结果如下
"D:\PyCharm 2021.3.3\dtest\aliang-py\Scripts\python.exe" "D:/PyCharm 2021.3.3/aliang-py/装饰器.py" 我是一个装饰器,我现在开始装饰你的函数了...... 我传入的参数是hello world fun 用时 2.01