W e S D
0 1

[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

 

 

 

posted @ 2015-09-22 16:32  SD.Team  阅读(314)  评论(0编辑  收藏  举报