码迷,mamicode.com
首页 > 编程语言 > 详细

Python 装饰器

时间:2018-12-14 22:40:43      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:基础   python   一个   动态   函数返回   元组   需要   代理   class   

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

  

Python 装饰器

标签:基础   python   一个   动态   函数返回   元组   需要   代理   class   

原文地址:https://www.cnblogs.com/demons97/p/10121670.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!