• [Python进阶]002.装饰器(1)


    装饰器(1)


    介绍

    • Python的装饰器叫Decorator,就是对一个模块做装饰。
    • 作用: 为已存在的对象添加额外功能。
    • 与Java中的注解相似,就是在方法前加@XXX来对这个方法做装饰。
    • 与Java中的注解相当复杂不同,Python的装饰器相当简单。
    • 函数式编程
    • 面向切片编程

    HelloWorld

    需求

    def fun(i):
        print i

    这是一个简单的方法,现在我们要在执行这个方法前后在执行一些其他代码,比如计算运行时间。
    简单的方式就是:

    import time
    
    def fun(i):
        t = time.time()
        print i
        t = time.time() - t     # 计算运行时间
        print '运行时间:',str(t)    # 打印时间

    这种方式不方便,也不能复用。

    使用函数式编程

    import time 
    
    # 计算运行时间
    def exec_time(fn, i):   # fn:方法; i:方法的参数
        t = time.time()
        fn(i)       # 调用fn
        t = time.time() - t     # 计算运行时间
        print '运行时间:',str(t)    # 打印时间
    
    
    def fun(i):
        print i
    
    # 调用
    exec_time(fun, i)

    使用这种方式,在实际调用时,需要包裹一层exec_time方法,虽然可以复用,使用起来但也并不灵活。

    加入装饰器

    下面我们就来加入修饰器

    from functools import wraps         # 引入装饰器需要的包
    import time
    
    # 定义一个装饰器
    def exec_time(fn):  # 参数fn:要修饰的方法,就是我们的fun
        @wraps(fn)
        def _(i):       # 修饰方法,参数i是fun传过来的参数
            t = time.time() 
            fn(i)       # 执行方法
            t = time.time() - t     
            print '运行时间:',str(t)
        return _        # 返回修饰后方法

    这样就完成了一个计算运行时间的装饰器。

    @exec_time
    def fun(i):
        print i
    
    @exec_time
    def fun2(i):
        print 'fun2', i

    使用起来十分方便。

    解析

    • 加入了@exec_time后的fun方法,在调用时会自动调用相当于exec_time(fun)的方法。
    • fun方法被exec_time装饰了,方法在开始和结束时会进行计时,并打印花费时间,这就是一个横切面,这种编程方式就是面向切面的编程。在方法执行的过程中横向插入逻辑,在很多地方都能大量减少重复代码。

     

    本站文章为 宝宝巴士 SD.Team 原创,转载务必在明显处注明:(作者官方网站: 宝宝巴士 
    转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4829345.html

     

  • 相关阅读:
    RabbitMQ 内存控制 硬盘控制
    Flannel和Docker网络不通定位问题
    kafka集群扩容后的topic分区迁移
    CLOSE_WAIT状态的原因与解决方法
    搭建Harbor企业级docker仓库
    Redis哨兵模式主从持久化问题解决
    mysql杂谈(爬坑,解惑,总结....)
    Linux的信号量(semaphore)与互斥(mutex)
    SIP协议的传输层原理&报文解析(解读rfc3581)(待排版) && opensips
    SIP协议的传输层原理&报文解析(解读RFC3261)(待排版)&&启动
  • 原文地址:https://www.cnblogs.com/superdo/p/4829345.html
Copyright © 2020-2023  润新知