• python-装饰器


    1.什么是装饰器

    装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,

    增加额外的功能,装饰器的返回值也是一个函数对象。

    装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景

    2.装饰器的形成过程

    import time
    
    def func1():
        print('in func1')
    
    def timer(func):
        def inner():
            start = time.time()
            func()
            print(time.time() - start)
        return inner
    
    func1 = timer(func1)
    func1()
    

    但是如果有多个函数,我都想让你测试他们的执行时间,你每次是不是都得func1 = timer(func1)?这样

    还是有点麻烦,因为这些函数的函数名可能是不相同,有func1,func2,graph,等等,所以更简单的方

    法,python给你提供了,那就是语法糖。

    #装饰器-语法糖
    import time def timer(func): def inner(): start = time.time() func() print(time.time() - start) return inner @timer #==> func1 = timer(func1) def func1(): print('in func1') func1()

    装饰器-带参数的语法糖

    def timer(func):
        def inner(a):
            start = time.time()
            func(a)
            print(time.time() - start)
        return inner
    
    @timer
    def func1(a):
        print(a)
    
    func1(1)

    能hole住所有参数的装饰器

    import time
    
    def timmerout(flag1):  # flag1 =flag
        def timmer(f):
            def inner(*args,**kwargs):
                if flag1:
                    start_time = time.time()
                    ret = f(*args,**kwargs)
                    end_time = time.time()
                    print('此函数的执行效率%s' % (end_time - start_time))
                    return ret
                else:
                    ret = f(*args, **kwargs)
                    return ret
            return inner
        return timmer
    
    
    flag = False
    @timmerout('alex','nan',1000)  # 1,将@ 与函数分开@     timmerout(flag)  返回了timmer 2,将@timmer结合。
    def func1():
        time.sleep(0.3)
        print('非常复杂......')
        return 666
    
    @timmerout(flag)
    def func2():
        time.sleep(0.3)
        print('非常复杂......')
        return 666
    
    
    @timmerout(flag)
    def func3():
        time.sleep(0.1)
        print('非常复杂......')
        return 666
    1,将@ 与函数分开@     timmerout(flag)  返回了timmer
    2,将@timmer结合
    
    
    
    def timmerout(flag1):  # flag1 =flag
        def timmer(f):
            def inner(*args,**kwargs):
                if flag1:
                    start_time = time.time()
                    ret = f(*args,**kwargs)
                    end_time = time.time()
                    print('此函数的执行效率%s' % (end_time - start_time))
                    return ret
                else:
                    ret = f(*args, **kwargs)
                    return ret
            return inner
        return timmer
    
    @timmerout('京东')  # 1,将@ 与函数分开@     timmerout(flag)  返回了timmer 2,将@timmer结合。
    def JDshop():
        time.sleep(0.3)
        print('非常复杂......')
        return 666
    
    @timmerout('京东')
    def JD():
        time.sleep(0.3)
        print('非常复杂......')
        return 666
    
    
    @timmerout('淘宝')
    def taobao():
        time.sleep(0.1)
        print('非常复杂......')
        return 666
    
    @timmerout('淘宝')
    def taobaoshop():
        time.sleep(0.1)
        print('非常复杂......')
        return 666
    
    func1()
    func2()
    func3()
    

      

     

  • 相关阅读:
    mySQL 重点
    JS代码预解析原理、函数相关、面向对象
    PHP中对数组进行操作的常用函数总结
    js函数和数组总结
    深入理解css网页布局细节
    AngularJS表单验证
    发送消息 缺少 更新的字段值
    springboot 下 logback + MDC的使用
    Mock的使用2
    StringUtils # split 的坑
  • 原文地址:https://www.cnblogs.com/xinlibao/p/9151131.html
Copyright © 2020-2023  润新知