装饰器(重点,难点) 开闭原则:             对功能的扩展开放            对代码的修改是封闭的 在目标函数前和后插入一段新的代码.不改变原来的代码 通用装饰器写法: # 存在的意义: 在不破坏原有函数调用的基础上,给韩式添加新的功能         def wrapper(fn):   # fn是目标函数             def inner(*args, **kwargs): # 聚合, 为了目标函数的传参                 ''''在目标函数之前....''''                 ret = fn(*arg, **kwargs) # 打散, 调用目标函数,ret是目标韩式的返回值                 ''''在目标函数之后....'''                 return ret    #把目标函数返回值返回.保证函数正常的结束             return inner           @wrapper   ###  func = wrapper(func)  == @wrapper         def func():             pass ####  func = wrapper(func)    #此时fn就是func         func()    #此时执行的是inner 举例造人 def wrapper(fn):     def inner():         print('浇水')         fn()         print('睡一觉')     return inner   def zaoren():     print('捏个泥人')     print('吹口仙气')     print('你就出来了')   zaoren = wrapper(zaoren) zaoren() 同一个函数被多个装饰器装饰    @wrapper1         @wrapper2         @wrapper3         def func():             pass          1  2  3  func 3  2  1 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 ##1111111 3333333 555555 我是可怜的func 666666 44444444 2222222 带参数的装饰器(难受)         def wrapper_out(参数):             def wrapper(fn):                 def inner(*args, **kwargs): # 聚合                     在目标函数之前                     ret = fn(*arg, **kwargs) # 打散                     在目标函数之后                     return ret                 return inner             return wrapper           @wrapper_out(实参)  # 执行的时候. 先执行函数的调用然后使用返回值和前面的@组合成装饰器语法糖         def func():             pass       eval  =>  文件操作     装饰器     函数 开始举例 def wrapper(fn):     def inner(*args, **kwargs):         print('问问金老板,行情怎么样啊')         ret = fn(*args, **kwargs)         print('金老板骗我,恨你')         return ret     return inner   def yue():     print('走啊,约不?') yue = wrapper(yue) yue() 进行判断 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 yue(): # 被 wrapper装饰     print("走啊. 约不?")   yue()  
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄