一,通用装饰器的回顾
开闭原则:对增加功能开放,对修改代码封闭
装饰器的作用:在不改变原有代码的基础上给函数增加功能.
写法:
def wrapper(fn):
def inner(*args,**kwargs):
"目标函数之前要做什么"
ret = fn(*args,**kwargs)
"目标函数之后要做什么"
return ret
return inner
扫描二维码关注公众号,回复:
1660422 查看本文章
@wrapper
def target_func():
"目标函数体"
target_func()
执行过程:1,程序从上往下执行,当执行到@wrapper的时候,把函数作为参数传递给wrapper函数,得到inner函数,重新赋值给target_func
2,当执行到target_func的时候,我们实际上执行的事inner函数,inner函数会先执行目标函数之前的代码,然后再执行你的目标函数,执行完目标函数最后执行的事目标函数之后的代码
二,函数的有用信息
1,给函数添加注释
2,获取函数的相关信息
函数名.__name__可以查看函数的名字
函数名.__doc__ 可以查看函数的文档注释
def chi(food,drink): ''' :param food: 参数food是什么意思 :param drink: 参数drink是什么意思 :return: 返回的是什么 ''' print(food,drink)
print(chi.__doc__) #获取函数的文档注释
print(chi.__name__) #获取到函数名
return "very good"
print("西瓜","桃子")
PS: *args **kwargs什么时候打散,什么时候聚合
1,接收函数的时候是聚合,声明参数
2,传递参数的时候是打散,给函数传递实参
三,装饰器传参
from functools import wraps def wrapper_out(flag): def wrapper(fn): @wraps(fn) def inner(*args,**kwargs): if flag == True: #查的严,需要问一下 print("问问金老板") ret = fn() print("金老板骗我") return ret else: #查的不严,不用问了 ret = fn(*args,**kwargs) return ret return inner return wrapper @wrapper_out(True) #传递True和False来控制装饰器的内部运行效果 def yue(): print("哈哈") yue()
执行步骤:先执行wrapper(True),然后再@返回值,返回值恰好是wrapper,结果就是@wrapper
四,多个装饰器装饰同一个函数
def wrapper1(fn): def inner(*args,**kwargs): print("111") ret = fn(*args,**kwargs) print("222") return ret return inner def wrapper2(fn): def inner(*args,**kwargs): print("333") ret = fn(*args,**kwargs) print("444") return ret return inner @wrapper2 @wrapper1 def eat(): print("我想吃水果") eat() # 333 # 111 # 我想吃水果 # 222 # 444
{ [ ( ) ] } 从左往右执行