zoukankan      html  css  js  c++  java
  • day 15 装饰器

    装饰器(重点,难点)
    开闭原则: 
               对功能的扩展开放
               对代码的修改是封闭的
    在目标函数前和后插入一段新的代码.不改变原来的代码
    通用装饰器写法:
    # 存在的意义: 在不破坏原有函数调用的基础上,给韩式添加新的功能
            def wrapper(fn):   # fn是目标函数
                def inner(*args, **kwargs): # 聚合, 为了目标函数的传参
                    ''''在目标函数之前....''''
                    ret = fn(*arg, **kwargs) # 打散, 调用目标函数,ret是目标韩式的返回值
                    ''''在目标函数之后....'''
                    return ret    #把目标函数返回值返回.保证函数正常的结束
                return inner
     
            @wrapper   ###  func = wrapper(func)  == @wrapper
            def func():
                pass
    ####  func = wrapper(func)    #此时fn就是func
            func()    #此时执行的是inner
    举例造人
    def wrapper(fn):
        def inner():
            print('浇水')
            fn()
            print('睡一觉')
        return inner
     
    def zaoren():
        print('捏个泥人')
        print('吹口仙气')
        print('你就出来了')
     
    zaoren = wrapper(zaoren)
    zaoren()
    同一个函数被多个装饰器装饰
       @wrapper1
            @wrapper2
            @wrapper3
            def func():
                pass
     
           1  2  3  func 3  2  1
    def wrapper1(fn):
        def inner(*args, **kwargs):
            print("1111111")
            ret = fn(*args, **kwargs)
            print("2222222")
            return ret
        return inner
     
    def wrapper2(fn):
        def inner(*args, **kwargs):
            print("3333333")
            ret = fn(*args, **kwargs)
            print("44444444")
            return ret
        return inner
     
    def wrapper3(fn):
        def inner(*args, **kwargs):
            print("555555")
            ret = fn(*args, **kwargs)
            print("666666")
            return ret
        return inner
     
     
    # 就近原则
    @wrapper1
    @wrapper2
    @wrapper3
    def func():
        print("我是可怜的func")
     
    func()
    # 1 2 3  func 3 2 1
    ##1111111
    3333333
    555555
    我是可怜的func
    666666
    44444444
    2222222
    带参数的装饰器(难受)
            def wrapper_out(参数):
                def wrapper(fn):
                    def inner(*args, **kwargs): # 聚合
                        在目标函数之前
                        ret = fn(*arg, **kwargs) # 打散
                        在目标函数之后
                        return ret
                    return inner
                return wrapper
     
            @wrapper_out(实参)  # 执行的时候. 先执行函数的调用然后使用返回值和前面的@组合成装饰器语法糖
            def func():
                pass
     
        eval  =>  文件操作
        装饰器
        函数
    开始举例
    def wrapper(fn):
        def inner(*args, **kwargs):
            print('问问金老板,行情怎么样啊')
            ret = fn(*args, **kwargs)
            print('金老板骗我,恨你')
            return ret
        return inner
     
    def yue():
        print('走啊,约不?')
    yue = wrapper(yue)
    yue()
    进行判断
    def wrapper_out(flag): # 装饰器本身的参数
        def wrapper(fn): # 目标函数
            def inner(*args, **kwargs): # 目标函数执行需要的参数
                if flag == True:
                    print("问问金老板. 行情怎么样啊")
                    ret = fn(*args, **kwargs) # 在执行目标函数之前
                    print("金老板骗我. 恨你")
                    return ret
                else:
                    ret = fn(*args, **kwargs)  # 在执行目标函数之前
                    return ret
            return inner
        return wrapper
     
     
    # 语法糖 @装饰器
    @wrapper_out(True) # 先执行wrapper_out(True) 返回一个装饰器   再和@拼接  @装饰器
    def yue(): # 被 wrapper装饰
        print("走啊. 约不?")
     
    yue()
     
  • 相关阅读:
    【C#进阶系列】06 类型和成员基础
    纪中5日T1 1564. 旅游
    纪中17日T1 2321. 方程
    纪中17日T2 2322. capacitor
    纪中10日T1 2313. 动态仙人掌
    纪中14日听课小结 图论 最短路 二分图 差分约束
    一个抓猫的游戏 消遣GAME 持续更新中!
    洛谷P1464 Function  HDU P1579 Function Run Fun
    洛谷P1976 鸡蛋饼
    纪中12日T1 2307. 选择
  • 原文地址:https://www.cnblogs.com/yanghongtao/p/10121496.html
Copyright © 2011-2022 走看看