装饰器
开闭原则:
对功能的扩展开发
对代码修改是封闭的
语法:
def wrapper(fn): ''''fn是目标函数,target_func
def inner(*args,**kwargs): ''''为了目标函数传参''''
'''在执行目标函数之前'''
ret = fn (*args,**kwargs) ''''调用目标函数,ret是目标函数的返回值
'''在执行目标函数之后''''
return ret ''''把目标函数返回值返回,保证函数正常结束
return inner
@wrapper ''''''target_func=wrapper( target_func )'''
def target_func( ) :
pass
target_func( ) ''''此时执行的是inner''''
装饰器存在意义:
1.python里的动态代理
2.不破坏原有的函数和原有的函数调用的基础上,给函数添加新功能
多个函数被多个装饰器装饰:
def wrapper1(fn):
def inner(*args,**kwargs):
'''在执行目标函数之前'''
ret = fn (*args,**kwargs)
'''在执行目标函数之后''''
return ret
return inner
def wrapper2(fn):
def inner(*args,**kwargs):
'''在执行目标函数之前'''
ret = fn (*args,**kwargs)
'''在执行目标函数之后''''
return ret
return inner
def wrapper3(fn):
def inner(*args,**kwargs):
'''在执行目标函数之前'''
ret = fn (*args,**kwargs)
'''在执行目标函数之后''''
return ret
return inner
@ wrapper1
@wrapper2
@ wrapper3
def func():
pass
fun()
执行顺序
1 2 3 func 3 2 1
def wrapper_out(flag):
def wrapper(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(False)
def yue():
print('走,约')
yue()