1. 装饰器
遵循的原则:
开闭原则: 对功能的扩展开放 对代码的修改是封闭
# 通用装饰器写法 # 存在的意义: 在不破坏原有函数和原有函数调用的基础上,给函数添加新的功能. 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
2. 带参数的装饰器
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) 返回一个装饰器, 再和@拼接 -> @装饰器 # @wrapper_out(False) # 走,开团 def yue(): # 被wrapper装饰 print('走,开团') yue()
3. 同一个函数被多个装饰器装饰
@wrapper1 @wrapper2 @wrapper3 def func(): pass # 1 2 3 func 3 2 1