zoukankan      html  css  js  c++  java
  • 9 装饰器

    1.  2个函数重名

    def test1():
        print('---a')
    def test1():
        print('---2')
    
    t =test1()
    
    
    ### 运行结果
    ---2
    

      

    2.实现验证功能

      1)版本1:实现验证

    def w1():
        print('---正在验证权限')
        f1()
    
    def f1():
        print('---f1')
    
    w1()
    
    
    ### 运行结果
    ---正在验证权限
    ---f1

      2)版本2:闭包

    def w1(func):
        
        def inner():
            print('---正在验证权限')
            func()
        return inner
    
    
    def f1():
        print('---f1')
    
    def f2():
        print('---f2')
    
    innerFunct = w1(f1)
    innerFunct()
    ---正在验证权限
    ---f1

       

      3)版本3:函数名换成f1()

    def w1(func):
        
        def inner():
            print('---正在验证权限')
            func()
        return inner
    
    def f1():
        print('---f1')
    
    def f2():
        print('---f2')
    
    f1 = w1(f1)
    f1()

         

     3.语法糖@w1

    def w1(func):
        
        def inner():
            print('---正在验证权限')
            func()
        return inner
    
    
    @w1  #相当于 f1 = w1(f1)
    def f1():
        print('---f1')
    @w1
    def f2():
        print('---f2')
    
    #f1 = w1(f1)
    f1()
    ---正在验证权限
    ---f1
    def w1(func):
        
        def inner():
            print('---正在验证权限')
            if False:
                func()
            else:
                print("---没有权限--")
        return inner
    
    
    @w1  #相当于 f1 = w1(f1)
    def f1():
        print('---f1')
    @w1
    def f2():
        print('---f2')
    
    #f1 = w1(f1)
    f1()

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

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

    没错, 从表面上看解释器仅仅会解释这两句代码,因为函数在 没有被调用之前其内部代码不会被执行。

    从表面上看解释器着实会执行这两句,但是 @w1 这一句代码里却有大文章, @函数名 是python的一种语法糖。

    4.2个装饰器,执行顺序

    #定义函数:完成包裹数据
    def makeBold(fn):
        def wrapped():
            return "<b>" + fn() + "</b>"
        return wrapped
    
    #定义函数:完成包裹数据
    def makeItalic(fn):
        def wrapped():
            return "<i>" + fn() + "</i>"
        return wrapped
    
    
    @makeBold
    @makeItalic
    def test2():
        return "hello world-2"
    
    print(test2())
    <b><i>hello world-2</i></b>

      1)分析

    #定义函数:完成包裹数据
    def makeBold(fn):
        def wrapped():
            print('----1')
            return "<b>" + fn() + "</b>"
        return wrapped
    
    #定义函数:完成包裹数据
    def makeItalic(fn):
        def wrapped():
            print('----2')
            return "<i>" + fn() + "</i>"
        return wrapped
    
    
    @makeBold
    @makeItalic
    def test2():
        print('----3')
        return "hello world-2"
    
    
    print(test2())
    ----1
    ----2
    ----3
    <b><i>hello world-2</i></b>

        

        

     5.装饰器的执行时间

    def w1(func):
        print("---正在装饰1----")
        def inner():
            print("---正在验证权限1----")
            func()
        return inner
    
    #只要python解释器执行到了这个代码,那么就会自动的进行装饰,而不是等到调用的时候才装饰的
    @w1
    def f1():
        print("---f1---")
    
    #在调用f1之前,已经进行装饰了
    #f1()
    
    
    ## 运行结果
    ---正在装饰--

         

      2个装饰器

    def w1(func):
        print('---正在装饰--') 
        def inner():
            print('---正在验证权限1--')
            func()
        
        return inner
    
    def w2(func):
        print('---正在装饰2--') 
        def inner():
            print('---正在验证权限2--')
            func()
        
        return inner
    @w2
    @w1
    def f1():
        print('---f1')
    
    f1()

        

    ---正在装饰--
    ---正在装饰2--
    ---正在验证权限2--
    ---正在验证权限1--
    ---f1
  • 相关阅读:
    Oracle
    Oracle11g服务详细介绍及哪些服务是必须开启的?
    数据结构——二叉树树的遍历理论与实现
    MapReduce新版客户端API源码分析
    【编程范式】汇编解释swap方法
    iPhone、iPod和iPad离线固件升级的方法
    Linux备份
    mysql下用户和密码生成管理
    The secret of ROWID
    linux文件权限解说
  • 原文地址:https://www.cnblogs.com/venicid/p/7928729.html
Copyright © 2011-2022 走看看