装饰器
# def zaoren(): # # # print("浇水") # 此需求有的时候需要. 有的时候不需要 # # print("捏个泥人") # print("吹口仙气") # print("你就出来了") # # # # zaoren() # # zaoren() # # zaoren() # # # 三年大旱. 没有水 # # # def water(): # print("浇水") # zaoren() # # # 此时的设计就不符合开闭原则 # zaoren() # water() # water() # water() # water() # water() # water() # water() # # 装饰器 # def wrapper(fn): # fn接收的是一个函数 # def inner(): # print("浇水") # fn() # 调用你传递进来的函数 # print("睡一觉") # return inner # # def zaoren(): # print("捏个泥人") # print("吹口仙气") # print("你就出来了") # # zaoren = wrapper(zaoren) # # zaoren() # zaoren() # def play(username, password): # print("双击lol") # print("登录", username, password) # print("选择狂战士") # print("进草丛") # print("崩山击, 十字斩") # # # # # # # def xiaoxiaole(qq): # print("登录qq账号") # print("消消乐") # # # # # 开挂 # # # 关闭外挂 # # # 在目标函数前和后插入一段新的代码. 不改变原来的代码 # def wrapper(fn): # fn = play # def inner(*args, **kwargs): # 无敌传参 接受到的是元组 ("alex", 123) # print("开挂") # ret = fn(*args, **kwargs) # 接受到的所有参数. 打散传递给正常的参数 # print("关闭外挂") # return "月之光芒" # return inner # # # play = wrapper(play) # play = inner # # ret = play('alex',"123") # # print(ret) # None # # ret = play(111,222) # print(ret) # 通用装饰器写法: # 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 = wrapper(target_func) # 此时fn就是target_func target_func() # 此时执行的是inner