• 10-5装饰器进阶_带参数的装饰器、多个装饰器装饰同一个函数


    带参数的装饰器

    只用在装饰器最外层嵌套一个即可,以达到轻易控制装饰器函数是否执行的作用

    import time
    flag = False
    def timmer_outer(flag):
            def timmer(func):
                def innner(*args,**kwargs):
                    if flag:
                        start = time.time()
                        ret = func(*args,**kwargs)
                        end = time.time()
                        print(end-start)
                        return ret
                    else:
                        ret = func(*args, **kwargs)
                        return ret
                return innner
            return timmer
    #执行步骤:两步(timmer_outer(flag)执行后返回timmer,再执行@tmmer)
    @timmer_outer(flag)
    def func1():
        time.sleep(0.1)
        print("函数1")
    @timmer_outer(flag)
    def func2():
        time.sleep(0.1)
        print("函数2")
    func1()
    func2()
    

    多个装饰器装饰同一个函数

    def wrapper1(func):#func-->f
        def inner1():
            print("wrapper1,before f")
            ret = func()
            func()  #f()
            print("wrapper1,after f ")
            return ret
        return inner1
    def wrapper2(func):
        def inner2():
            print("wrapper2,before f")
            ret = func()
            func()  #inner1()
            print("wrapper2,after f ")
            return ret
        return inner2
    #f=wrapper2(f) = f=wrapper2(inner1) = inner2
    @wrapper2
    #   f=wrapper1(f) = inner1
    @wrapper1
    def f():
        print("in f")
        return '娃哈哈'
    print(f())
    

    结果:

    wrapper2,before f
    wrapper1,before f
    in f
    wrapper1,after f
    wrapper2,after f
    娃哈哈

     

  • 相关阅读:
    Windows 服务程序(一)
    API---注册表编程
    API---文件操作
    main(argc, char *argv[])
    C 自删除技术---批处理方式
    分治法排序
    TDD尝试:nodejs单元测试
    尝试create tech team
    Yum重装走过的坑
    求生欲很强的数据库
  • 原文地址:https://www.cnblogs.com/Cheryol/p/9745082.html
Copyright © 2020-2023  润新知