装饰器进阶
---恢复内容开始---
装饰器的形成的过程:最简单的装饰器,有返回值,有一个参数,万能参数
装饰器的作用----不想修改函数的调用方式,但是还想再原来的函数前后添加功能
装饰器的原则-----开放封闭式原则:开放--对外是开放的 封闭---对修改的是封闭的
1)最简单的装饰器
import time --------别人已经写好的一个方法,就是返回1970到现在的秒数 def wrapper(f): --------装饰器函数 f是被装饰器的函数 def inner(): -------- 内部函数,形成一个闭包 ra= time.time() -------- 返回当前的秒数 f() -------- 被装饰器函数 ba= time.time() -------返回当前秒数 print(ba-ra) -------计算程序需要多少时间运行 return inner --------函数也是可以用于返回值的 @wrapper --------语法糖 @函数装饰器 def fun(): --------被装饰器函数 time.sleep(2) ---------停顿2秒,在执行下面程序 print('123') fun() --------相当于==inner 因为@wrapper 相当于 fun=wraaper(fun)
2)有返回值的装饰器
1 import time 2 def wrapper(f): 3 def inner(): 4 ra= time.time() 5 ret = f() -----因为被装饰器有返回值,所以需要返回值接受 6 ba= time.time() 7 print(ba-ra) 8 return ret --------返回值 9 return inner 10 @wrapper 11 def fun(): 12 time.sleep(2) 13 print('123') 14 return '你好吗' 15 ret = fun() 16 print(ret)
3)万能参数
1 import time 2 def wrapper(f): 3 def inner(*args,**kwargs):----因为fun相当于inner那么里面也要有参数 4 ra= time.time() 5 ret = f(*args,**kwargs)-------万能参数,无敌 6 ba= time.time() 7 print(ba-ra) 8 return ret 9 return inner 10 @wrapper 11 def fun(a,b=2): 12 time.sleep(2) 13 print('123') 14 return '你好吗' 15 ret = fun(2,4) 16 print(ret)
4)wraps用法
1 from functools import wraps 2 def wrapper(f): 3 @wraps(f) 4 def inner(*args, **kwargs): 5 print('快放假了') 6 ret = f(*args, **kwargs) 7 print('真的放假了') 8 return ret 9 10 return inner 11 12 13 @wrapper 14 def fun(day): 15 """ 16 放假通知 17 """ 18 print('还有%s天放假' % day) 19 return '好快心啊' 20 21 print(fun.__name__) 22 print(fun.__doc__) 23 ra = fun(3) 24 print(ra)
5)带参数的装饰器,用于如果你有多个被装饰的函数,哪些不要用的,判断一下即可
1 import time 2 FLAGE = False 3 def wrapper_na(FLAGE): 4 def wrapper(f): 5 def inner(*args, **kwargs): 6 if FLAGE: 7 an = time.time() 8 ret = f(*args, **kwargs) 9 ba = time.time() 10 print(ba - an) 11 return ret 12 else: 13 ret = f(*args, **kwargs) 14 return ret 15 return inner 16 return wrapper 17 18 19 @wrapper_na(FLAGE) ---这个相当于 @==fun == wrapper(fun) 然后 wrapper=wrapper_na(flage) 20 def fun(a, b): 21 time.sleep(2) 22 print('大家好') 23 return '你好' 24 @wrapper_na(FLAGE) 25 def fun1(a,b): 26 time.sleep(3) 27 print('好好好') 28 return '大集合' 29 30 ret = fun(1, 2) 31 print(ret) 32 33 ret1 = fun1(1,32) 34 print(ret1)
6)多个装饰器装饰一个函数
1 def wrapper1(f): 2 def inner(): 3 print('你好1') 4 f() 5 print('很好1') 6 return inner 7 8 def wrapper2(f): 9 def inner2(): 10 print('你好2') 11 f() 12 print('很好2') 13 return inner2 14 @wrapper1 15 @wrapper2 16 def fun(): 17 print('都很好') 18 fun() 19 20 输出--------------21 你好2 22 都很好 23 很好2 24 很好1
执行顺序:
---恢复内容结束---