1、通用装饰器回顾
开闭原则:对增加功能开放,修改代码封闭
装饰器的作用:在不改变原有代码的基础上给一个函数增加功能
通用装饰器的写法:
1 def wrapper(fn): 2 def inner(*args, **kwargs): 3 """before the func""" 4 ret = fn(*args, **kwargs) 5 """after the func""" 6 return ret 7 return inner 8 @wrapper 9 def func(): 10 print("this is func") 11 func()
2、函数的有用信息
1 def eat(food,drink): 2 """ 3 这里是函数的注释,先写一下当前这个函数是干什么的,比如 4 我这个函数就是一个吃 5 :param food:参数food是什么意思 6 :param drink:参数drink是什么意思 7 :return:返回的是什么东东 8 """ 9 print(food,drink) 10 """ 11 这个可以获取到么? 12 """ 13 print(eat.__doc__) 14 print(eat.__name__) 15 return "very good" 16 eat("吃嘛嘛香","我不想吃") 17 print(eat.__doc__) 18 print(eat.__name__) 19 # 函数名.__name__可以查看函数的名字 20 # 函数名.__doc__可以查看函数的文档注释
当函数被装饰器装饰之后,其函数名在查看的时候会改变成inner,为了解决这个问题需要引入from functools import wraps,在inner函数上方@wraps,这样当查看外部的原函数的名字时会按原本的来。
3、带参数的装饰器
1 from functools import wraps 2 def wrapper_out(flag): 3 def wrapper(fn): 4 @wraps(fn) 5 def inner(*args,**kwargs): 6 if flag == True: 7 print("约之前问问金老板,是不是安全啊!") 8 ret = fn(*args,**kwargs) 9 print("我擦,金老板骗我!") 10 return ret 11 else: 12 ret = fn(*args, **kwargs) 13 return ret 14 return inner 15 return wrapper 16 @wrapper_out(True) 17 def yue(): 18 print("约起来吧") 19 yue() 20 print(yue.__name__)
4、多个装饰器同事装饰一个函数
1 def wrapper1(fn): 2 def inner(*args, **kwargs): 3 print("alex要上香了!") 4 ret = fn(*args, **kwargs) 5 print("武sir要上香了!") 6 return ret 7 return inner 8 def wrapper2(fn): 9 def inner(*args, **kwargs): 10 print("来来来,老男孩开始给财神香了!") 11 ret = fn(*args, **kwargs) 12 print("好好好,财神我会保护你们的!") 13 return ret 14 return inner 15 def wrapper3(fn): 16 def inner(*args, **kwargs): 17 print("来来来,看看老男还这帮财迷!") 18 ret = fn(*args, **kwargs) 19 print("我擦,你们给财神我上假香,画圈圈诅咒你们!") 20 return ret 21 return inner 22 23 @wrapper3 24 @wrapper2 25 @wrapper1 26 def money(): 27 print("今年要发大财了啊!") 28 money() 29 # 多个装饰器同时装饰一个函数会依照顺序执行,类似于 {[(目标函数)]}从前往后执行