zoukankan      html  css  js  c++  java
  • 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()
    

      

     

  • 相关阅读:
    常见web安全攻防总结
    想使用消息队列,先考虑下这些问题
    Nginx基本属性配置详解
    mysql 数据分析如何实现日报、周报、月报和年报?
    SQL优化
    SQL优化例子
    工厂模式,从第三方登录说起
    最常见 200+ 面试题答案全解析-面试必备
    使用sslsplit嗅探tls/ssl连接
    选择指定图层上的所有实体
  • 原文地址:https://www.cnblogs.com/xinlibao/p/9151131.html
Copyright © 2011-2022 走看看