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
原文:https://www.cnblogs.com/demons97/p/10121670.html