装饰器

作者: 流光汐舞 | 来源:发表于2017-07-14 19:48 被阅读0次

    装饰器功能,就是在运行原来原代码功能基础上,加上些其它功能,比如:
    1、引入日志
    2、函数执行时间统计
    3、执行函数前预备处理
    4、执行函数后清理功能
    5、权限校验等场景
    6、异常的处理
    7、缓存等等。
    不修改原来的代码,进行功能的扩展。

    先明白下面的代码:

    Paste_Image.png

    写代码要遵循开放封闭原则
    封闭:已实现的功能代码块
    开放:对扩展开发

    虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展。

    def w1(func):
        def inner():
            print('验证1')
            func()
        return inner
    
    @w1
    def f1():
        print('f1')
    

    python解释器就会从上到下解释代码,步骤如下:

    def w1(func): ==>将w1函数加载到内存.
    @w1
    

    没错, 从表面上看解释器仅仅会解释这两句代码,因为函数在没有被调用之前其内部代码不会被执行。
    从表面上看解释器着实会执行这两句,但是 @w1 这一句代码里却有大文章, @函数名是python的一种语法糖。

    上例@w1内部会执行一下操作:
    执行w1函数
    执行w1函数 ,并将 @w1 下面的函数作为w1函数的参数,即:@w1 等价于 w1(f1) 所以,内部就会去执行:

    def inner(): 
        #验证 1
        #验证 2
        #验证 3
        f1()     # func是参数,此时 func 等于 f1 
    

    return inner# 返回的 inner,inner代表的是函数,非执行函数 ,其实就是将原来的 f1 函数塞进另外一个函数中
    w1的返回值
    将执行完的w1函数返回值 赋值 给@w1下面的函数的函数名f1 即将w1的返回值再重新赋值给 f1,即:

    新f1 = def inner(): 
                #验证 1
                #验证 2
                #验证 3
                原来f1()
            return inner
    

    接下来是多个装饰器的运用

    多个装饰器,按照从内往外(从下往上)先后顺序执行
    为了方便记忆:可以理解为先写后运行,先写后结束

    def makeBold(fn):
        print('makeBold...')
        def wrapped():
            return "--1--" + fn() + "--1--"
        return wrapped
    
    def makeItalic(fn):
        print('makeItalic...')
        def wrapped():
            return "--2--" + fn() + "--2--"
        return wrapped
    
    @makeBold
    def test1():
        return "hello world-1"
    
    @makeItalic
    def test2():
        return "hello world-2"
    
    @makeBold
    @makeItalic
    def test3():
        return "hello world-3"
    
    print(test1())
    print(test2())
    print(test3())
    

    运行结果如下:

    makeBold...
    makeItalic...
    makeItalic...
    makeBold...
    --1--hello world-1--1--
    --2--hello world-2--2--
    --1----2--hello world-3--2----1--
    

    相关文章

      网友评论

          本文标题:装饰器

          本文链接:https://www.haomeiwen.com/subject/uppohxtx.html