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

     

  • 相关阅读:
    DataTable
    asp.net2.0异步页面和异步web部件
    Ref 和Out 区别
    关于String str =new String("abc")和 String str = "abc"的比较
    MongoDB介绍及安装
    通过MongoDB的samus驱动实现基本数据操作
    SQL 联合索引 与 单一列的索引 比较
    C#字符串处理(String与StringBuilder)
    C#操作文件夹及文件的方法的使用
    常见的sql语句 注意点及用法【区分mysql 和Sqlserver】
  • 原文地址:https://www.cnblogs.com/superdo/p/4829345.html
Copyright © 2011-2022 走看看