# 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