装饰器

# 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

  

posted @ 2018-12-14 16:35  =-=-  阅读(153)  评论(0编辑  收藏  举报