Python自学笔记(15day)
装饰器
(1)装饰器的原则:开放封闭原则
开放:对扩展是开放的
封闭:对修改是封闭的
(2)装饰器的作用:不想修改函数的调用方式,但是还想在原来的函数前后添加功能
装饰器的分类
(1)不含有返回值return的装饰器
import time def func(): time.sleep(0.01) print("帅哥") def timmer(f): #装饰器函数,timmer装饰器函数函数名字 def inner(): #定义一个闭包函数inner() start=timer.timer() f() end=time.time() print(end-start) return inner func=timmer(func) #返回的是闭包函数的函数名字 func()
(2)含有返回值return的装饰器
import time def func(): time.sleep(0.01) print("帅哥") return "王然" def timmer(f): #装饰器函数,timmer装饰器函数函数名字 def inner(): #定义一个闭包函数inner() start=timer.timer() ret=f() #调用f()拿到返回值赋值给ret end=time.time() print(end-start) return ret #将ret返回给闭包函数 return inner func=timmer(func) #返回的是闭包函数的函数名字 print(func()) #func()拿到返回值"王然" #被装饰的函数有返回值return时,这时候在调用fun(),执行闭包函数打印出来,闭包函数本身没 #有返回值,打印就会出错,所以加一个返回值,返回的是被装饰函数的返回值,用变量ret代替, #再闭包函数中,func()赋值给ret
(3)带有一个参数的装饰器
import time def func(a): time.sleep(0.01) print("帅哥",a) return "王然" def timmer(f): #装饰器函数,timmer装饰器函数函数名字 def inner(a): #定义一个闭包函数inner() start=timer.timer() ret=f(a) #调用f()拿到返回值赋值给ret end=time.time() print(end-start) return ret #将ret返回给闭包函数 return inner func=timmer(func) #返回的是闭包函数的函数名字 print(func(a)) #func()拿到返回值"王然" #当被装饰函数有参数时,调用func(),也必须加一个参数,但是实际上func()是执行闭包函数, #所以inner(a)也要加上参数,里面的f(a)也要加上参数
(4)带有多参数与混合参数的装饰器
import time def func(*args,**kwargs): time.sleep(0.01) print("帅哥",a) return "王然" def timmer(f): #装饰器函数,timmer装饰器函数函数名字 def inner(*args,**kwargs): #定义一个闭包函数inner() start=timer.timer() ret=f(*args,**kwargs) #调用f()拿到返回值赋值给ret end=time.time() print(end-start) return ret #将ret返回给闭包函数 return inner func=timmer(func) #返回的是闭包函数的函数名字 print(func(1,a=2)) #func()拿到返回值"王然"
总结:装饰器固定格式
def wrapper(f): #定义一个装饰器函数,wrapper装饰器函数名,f被装饰函数名 def inner(*args,**kwargs): #定义闭包函数,出传入参数 """在被装饰函数之前要做的事情""" ret=f(*args,**kwargs) #被装饰函数赋值 """在被装饰之后做的事情""" return ret return inner #返回闭包函数函数名给装饰器函数 @wrapper #等价于列子中的 func=wrapper(f):得到闭包函数函数名字 def func(*args,**kwargs): #被装饰的函数 pass
func(*args,**kwargs) #调用被装饰函数,其实相当于执行@wrapper():执行闭包函数