-
什么是装饰器?
装饰:给已有的对象(函数)添加新的功能
器:工具 在python中指具备某些功能的函数
装饰器:装饰器就是一个给其他函数增加功能的函数
-
一种设计原则:
开闭原则:对扩展开放
-
装饰器怎么用
我们用一个例子说明装饰器的作用及用法
例子: 现需要统计一段程序运行的时间
#统计程序运行时间,首先我们写一个程序 import time def index(): time.sleep(1) print('login') #以上就是一个打印login的程序,该程序休眠时间为1S #如果我们要增加一个计时功能,该怎么实现呢?首先我们可以尝试从我们的设计原则入手 #如果我们按照增加代码的形式可以看下: import time def index(): time.sleep(1) print('login') start=time.time() index() end = time.time() print('程序运行的时间',end-start) #或者 import time def index(): time.sleep(1) print('login') def wrapper(): start=time.time index() end=time.time print('程序运行时间',end-start) wrapper() #如果这样写我们就改变了源码或调用方式,不符合要求 #那我们按照不改变源码,不改变调用方式 #利用闭包函数 import time def index(): time.sleep(1) print('login') def time_count(func): #func=index #利用闭包函数的将变量func=index带给内部的wrapper函数 def wrapper(): start=time.time() func() end=time.time() print('程序运行时间',end-start) return wrapper #time_count函数的返回值为wrapper函数 index=time_count(index) #index=wrapper 括号内index为初始的index index() #调用index就可以实现计时功能
为了让我们作的修改更能灵活,能继续增加功能,并且如果原代码函数有返回值,需要我们将返回值传递出来,我们可以将装饰器改成
import time def time_count(func): #func=index #利用闭包函数的将变量func=index带给内部的wrapper函数 def wrapper(*args, **kwargs): start=time.time() res=func(*args, **kwargs) end=time.time() print('程序运行时间',end-start) return res return wrapper #time_count函数的返回值为wrapper函数 @time_count def index(): time.sleep(1) print('login') return 123 res=index() print('返回值res',res)