Python基础15_装饰器

Posted 孤雁南飞123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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了, 所以执行顺序就像: 
    外层装饰器前 -- 内层装饰器前 -- 目标 -- 内层装饰器后 -- 外层装饰器后 -- 目标函数返回值






































































以上是关于Python基础15_装饰器的主要内容,如果未能解决你的问题,请参考以下文章

python基础语法15 组合,封装,访问限制机制,内置装饰器property

python3基础09(装饰器的使用)

Python基础day-8[装饰器补充,迭代器(未完)]

python基础学习-装饰器基本原理

python基础09--闭包,装饰器

Python-20_装饰器-01_基础高阶函数闭包