zoukankan      html  css  js  c++  java
  • Python基础15_装饰器

     一. 装饰器
        开闭原则: 软件设计的原则之一, 又称为开放封闭原则. 
        开放: 对功能扩展开放
        封闭: 对修改代码封闭
        装饰器: 在目标函数前或后插入一段新的代码, 不改变目标函数的代码
        可以给目标函数传参, 拿到目标函数的返回值
        python里面的动态代理
        在不破坏目标函数和目标函数调用的基础上给函数添加新的功能
        通用语法:
            def wrapper(fn):                        # fn 是目标函数
                def inner(*args, **kwargs):            # 聚合    给目标函数传参
                    """在目标函数之前进行操作"""
                    ret = fn(*args, **kwargs)        # 打散    执行目标函数, 接收目标函数的返回值"xxx"
                    """在目标函数之后进行操作"""
                    return ret                        # 返回目标函数的返回值"xxx", 保证函数正常结束
                return inner                        # 返回inner的返回值"xxx"
            @wrapper                                # 语法糖 装饰器中特有 相当于 target_func = wrapper(target_func)
            def target_func()
                pass
                return "xxx"
            # target_func = wrapper(target_func)
            ret = target_func()                        # 执行inner, 并接收inner的返回值"xxx"
            print(ret)                                # 最终打印的是目标函数的返回值"xxx"
    二. 带参数的装饰器
        
        语法:
        def wrapper_out(形参):                    
            def wrapper(fn):
                def inner(*args, **kwargs):
                    """在目标函数之前进行操作"""
                    ret = fn(*args, **kwargs)
                    """在目标函数之后进行操作"""
                    return ret
                return inner
            return wrapper
        @wrapper_out(实参)
        def func():
            pass
        func()
    三. 多个装饰器装饰同一个函数
        def wrapper1(fn):
            def inner(*args, **kwargs):
                print(111111)
                ret = fn(*args, **kwargs)
                print(222222)
                return ret
            return inner
        def wrapper2(fn):
            def inner(*args, **kwargs):
                print(333333)
                ret = fn(*args, **kwargs)
                print(444444)
                return ret
                return inner
        @wrapper1
        @wrapper2
        def target_func():
            print("我是target_func")
            return "target_func"
        ret = target_func()
        print(ret)
        # 打印结果
            111111
            333333
            我是target_func
            444444
            222222
            target_func
        执行顺序: 首先@wrapper2装饰起来, 然后获取到一个新函数是wrapper2中的inner, 然后执行@wrapper1, 这个时候, wrapper1装饰的就是wrapper2中的inner了, 所以执行顺序就像: 
        外层装饰器前 -- 内层装饰器前 -- 目标 -- 内层装饰器后 -- 外层装饰器后 -- 目标函数返回值

  • 相关阅读:
    Centos7 Apache 2.4.18编译安装
    Centos7 mysql-community-5.7.11编译安装
    Centos7 安装MPlayer过程详解
    Vmware虚拟机克隆的网卡问题
    虚拟机VMware新增硬盘无法识别问题
    python推导式
    Python迭代器和生成器
    Python装饰器
    Python函数初识二
    Python函数初识
  • 原文地址:https://www.cnblogs.com/guyannanfei/p/10121475.html
Copyright © 2011-2022 走看看