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

Python基础15_装饰器

时间:2018-12-14 21:16:01      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:int   参数   聚合   动态   形参   函数返回值   目标   out   函数   

 一. 装饰器
    开闭原则: 软件设计的原则之一, 又称为开放封闭原则. 
    开放: 对功能扩展开放
    封闭: 对修改代码封闭
    装饰器: 在目标函数前或后插入一段新的代码, 不改变目标函数的代码
    可以给目标函数传参, 拿到目标函数的返回值
    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_装饰器

标签:int   参数   聚合   动态   形参   函数返回值   目标   out   函数   

原文地址:https://www.cnblogs.com/guyannanfei/p/10121475.html

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