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()
     
  • 相关阅读:
    数据驱动编程法
    23个设计模式的简明教程
    分享一篇文章C语言字节对齐问题(适用于C++)转载至http://blog.csdn.net/21aspnet/article/details/6729724
    关于C++类中访问权限的若干疑问(虚函数访问权限)
    利用C# 反射设计支持可扩展插件的应用程序
    隐藏控制台console application窗口
    Intellij IDEA社区版上新建项目或模块没有Spring Initializr选项解决办法
    mac jmeter 界面乱码
    windows 查看端口被占用进程
    php static 变量声明
  • 原文地址:https://www.cnblogs.com/yanghongtao/p/10121496.html
Copyright © 2011-2022 走看看