现在的位置: 首页 > 综合 > 正文

(转)Python装饰器与面向切面编程

2013年12月04日 ⁄ 综合 ⁄ 共 868字 ⁄ 字号 评论关闭

原文:http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html

Python装饰器与面向切面编程

今天来讨论一下装饰器。装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

1. 装饰器入门

1.1. 需求是怎么来的?

装饰器的定义很是抽象,我们来看一个小例子。

?
1
2
3
4
def foo():
    print 'in
foo()'
 
foo()

这是一个很无聊的函数没错。但是突然有一个更无聊的人,我们称呼他为B君,说我想看看执行这个函数用了多长时间,好吧,那么我们可以这样做:

?
1
2
3
4
5
6
7
8
import time
def foo():
    start
= time.clock()
    print 'in
foo()'
    end
= time.clock()
    print 'used:',
end
- start
 
foo()

很好,功能看起来无懈可击。可是蛋疼的B君此刻突然不想看这个函数了,他对另一个叫foo2的函数产生了更浓厚的兴趣。

怎么办呢?如果把以上新增加的代码复制到foo2里,这就犯了大忌了~复制什么的难道不是最讨厌了么!而且,如果B君继续看了其他的函数呢?

1.2. 以不变应万变,是变也

还记得吗,函数在Python中是一等公民,那么我们可以考虑重新定义一个函数timeit,将foo的引用传递给他,然后在timeit中调用foo并进行计时,这样,我们就达到了不改动foo定义的目的,而且,不论B君看了多少个函数,我们都不用去修改函数定义了!

?
1
2
3
4
5
6
7
8
9
10
11
12
import time
 
def foo():
    print 'in
foo()'
 
def timeit(func):
    start
= time.clock()
    func()

抱歉!评论已关闭.