zoukankan      html  css  js  c++  java
  • 带参数的装饰器

    例:

    import time
    FLAG = False
    def test(flog): 
        def timer(f):
            def inner(*args,**kwargs):
                if flog: 
                    start_time = time.time()
                    f(*args,**kwargs)
                    end_time = time.time()
                    print(end_time - start_time)
                else:
                    f(*args, **kwargs)
                    print('不用算时间')
            return inner
        return timer
    
    # timer = test(FLAG)          #两句加起来等于 @test(FLAG)
    # @timer #func= timer(func)   #两句加起来等于 @test(FLAG)
    @test(FLAG)  #分两部看,其中test(FLAG):test(FLAG) = test(FLAG),作用是传参数给装饰器函数test,然后返回第二层装饰器timer的内存地址
            #这时test(True)=tiemr的内存地址,语句才加上@开始读。也就是@timer
    def func(): time.sleep(1) print('aike,你好') print(func()) print(func())

    执行顺序:

     知识点:

    timer = test(FLAG)与@timer,两句加起来等于@test(FLAG)的作用;
    @test(FLAG)执行时分两步看,其中test(FLAG):test(FLAG) = test(FLAG),作用是传参数给装饰器函数test,
    然后返回第二层装饰器timer的内存地址这时test(True)=tiemr的内存地址,语句才加上@开始读。也就是@timer

    装饰器函数的第一层函数test仅仅起到的作用是传参和返回第二层装饰器函数timer的内存地址。返回timer的内存地址后,
    @test(FLAG)=@timer,然后就可以通过全局传参的方式,在被装饰函数第三层通过调用第一层接收过来的外部参数进行条件判断;
    传参顺序为,全局变量赋值-->语法糖调用变量方式传参-->第一层装饰器函数接收参数-->装饰器函数内部调用
  • 相关阅读:
    第4章.计算节点
    Eclipse插件ViPlugin2.X的破解方法
    金刚经
    js
    C++ 重写重载重定义区别
    string::substr()简介
    信息熵与二进制
    一个简单的条件概率问题
    HPLINUX hplinux 安装升级 至 jdk1.8
    linux 解压命令
  • 原文地址:https://www.cnblogs.com/aizhinong/p/11368137.html
Copyright © 2011-2022 走看看