day12 装饰器进阶
本节主要内容:
1通用装饰回顾
2函数的有用信息
3带参数的装饰器
4多个装饰器同时装饰一个函数
一 通用装饰器的回顾
开闭原则:对增加功能的开放,对修改代码封闭
装饰器的作用:再不改变原有代码的基础上给函数增加新功能
通用装饰器的写法
def warpper(fn): def inner(*args,**kwargs): """执行前的""" ret=fn(*args,**kwargs)#接受 """在目标函数执行之后""" return ret return inner @warpper def fun(): print("我要学python") fun()
执行过程:
1程序从上自下,当执行到@warpperd的时候,吧函数作为参数传递给warpper函数,得到inner函数,重新赋值给fun
2挡执行到fun的时候我们实际上执行的是inner函数,inner函数会执行目标函数之前的代码,然后在执行你的目标函数,执行完目标函数最后执行的是目标函数之后的代码
二 函数的有用信息
1如何给函数添加注释
def chi(food,drink): """这里是函数的注释,先写一下这个函数是做什么的",比如我这个函数 就是一个吃:param foood; 参数food是什么意思?" param drink;参数drink是什么意思" return返回的什么东西""" print(food,drink) return "very good" print(chi.__doc__) print(chi.__name__) chi("吃嘛嘛香","我不想出") print(chi.__doc__) #获取函数的注释 print(chi.__name__) #获取函数的名字
from functools import wraps
@wrap(fn) 吧你的函数的名字和doc换成你的 目标函数
from functools import wraps def wrapper(fn): @wraps(fn) #这个代码的作用吧inner的__name__,__doc__换成fn 的 def inner(*args,**kwargs): print("我是前面") ret=fn(*args,**kwargs) print("我是后面") return ret return inner @wrapper def func(): print("我是func") func()
2回顾装饰器
还是原先的那串代码
3带参数的装饰器
from functools import wraps def wrapper(fn): @wraps(fn) def inner(*args,**kwargs): print("问问金老板怎么样啊") ret=fn(*args,**kwargs) print("艹,金老板骗我") return ret return inner @wrapper def fun(): print("约一约") fun()
给上层函数装一个开关需要的时候就问金老板 如果不要紧就不问了改如何实现?
from functools import wraps def wrapper__out(flag): def wrapper(fn): @wraps(fn) def inner(*args,**kwargs): if flag==True: print("问问金老板怎么样啊") ret=fn(*args,**kwargs) print("艹,金老板骗我") return ret else: ret=fn(*args,**kwargs) return ret return inner return wrapper @wrapper__out(True) #传递True和False来控制装饰器内部的运行效果 def fun(): print("约一约") fun()
四 多个装饰器装饰同一个函数
def wrapper1(fn): def inner(*args,**kwargs): print("我要烧香") ret=fn(*args,**kwargs) print("熊猫烧香") return ret return inner def wrapper2(fn): def inner(*args,**kwargs): print("大哥烧香") ret=fn(*args,**kwargs) print("徐阳烧香") return ret return inner @wrapper1 @wrapper2 def func(): print("我是func") func()