装饰器
装饰器形成的过程 : 最简单的装饰器——有返回值的——有一个参数——万能参数
装饰器的作用:不想修改函数的调用方式 但是还想在原来的函数前后添加功能
原则 :开放封闭原则
语法糖 :@装饰器函数名
装饰器的固定模式
原则:开放封闭原则
开放:对扩展是开放的
封闭:对修改是封闭的
首先我们来逐步实现这么一个功能吧
计算代码运行的时间
#先来看下需要的组件 import time #time 模块 time.time() #获取当前时间 time.sleep(5) #让程序睡眠多少时间 print(time.time()) #来试下
我们来写一个可以计算时间的函数
def func(): start=time.time() time.sleep(0.1) #时间太短 系统会显示 0.0,所以我们让他休眠 0.1s print("计算程序执行的时间") end=time.time() print(end-start) func()
但是这里有一个问题:如果要计算很多函数的运行时间,那不是要在函数中都加上几行计算的代码,这显然是不可行的,一般写好的没问题的函数,是不会去对它进行修改,而且还很麻烦
所以这里我们写一个计算时间的函数独立出来
def times(f): start=time.time() time.sleep(0.1) f() end=time.time() print(end-start) def func(): print("计算程序执行的时间") def func2(): print(time.sleep(5)) times(func) times(func2)
但是这样貌似还有一个问题,我要计算时间的函数只能一个一个的运行,或者写 n 个 time() 来调用
接着我们来了解下装饰器吧,解决这样的问题
先来写一个简单的装饰器
#待完善
装饰器的固定模式
def wrapper(f): #装饰器函数,f是被装饰的函数 def inner(*args,**kwargs): #定义一个内置函数,且和下面统级别的返回值名字一致且不加括号 #动态参数一定要原封不动的传给 被装饰的函数 f() '''在被装饰函数之前要做的事''' ret = f(*args,**kwargs) #被装饰的函数 函数执行完的返回值要原封不动传给 return '''在被装饰函数之后要做的事''' return ret return inner @wrapper #语法糖 @装饰器函数名 等价于 func = wrapper(func) def func(a,b): #被装饰的函数 time.sleep(0.01) print('你好:世界',a,b) return '新年好' #print(func(23,45)) #接收返回值 ret = func(23,45) #接收返回值 print(ret)