带参数的装饰器

例:

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,然后就可以通过全局传参的方式,在被装饰函数第三层通过调用第一层接收过来的外部参数进行条件判断;
传参顺序为,全局变量赋值-->语法糖调用变量方式传参-->第一层装饰器函数接收参数-->装饰器函数内部调用

 

posted @ 2019-08-17 12:10  aikell  阅读(279)  评论(0编辑  收藏  举报