python--装饰器
二 .通用装饰器的写法
python里面的动态代理.
存在的意义: 在不破坏原有的函数和原有函数的调用基础上,给函数添加新的功能
def wrapper(fn): # fn是目标函数. 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
二 .带有参数的装饰器
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(True) # 先执行wrapper_out(True) 返回一个装饰器 再和@拼接 @装饰器 def play(): # 被 wrapper装饰 print("走啊,打球去") play()
三 .多个装饰器装饰同一个函数
def wrapper1(fn): def inner(*args, **kwargs): print("1111111") ret = fn(*args, **kwargs) print("2222222") return ret return inner def wrapper2(fn): def inner(*args, **kwargs): print("3333333") ret = fn(*args, **kwargs) print("44444444") return ret return inner def wrapper3(fn): def inner(*args, **kwargs): print("555555") ret = fn(*args, **kwargs) print("666666") return ret return inner # 就近原则 @wrapper1 @wrapper2 @wrapper3 def func(): print("我是可怜的func") func() # 1 2 3 func 3 2 1