python 装饰器@ 面向切面的编程

装饰器@ 面向切面的编程

参考

import time
def foo():
    print 'this is foo'

def timeit(func):
    start = time.clock()
    func()
    end = time.clock()
    print 'used time : ', (end-start)

timeit(foo)

本来可以这样使用的,但是如果是这样使用的话,语义会出现问题;所以为了让我们感觉还是在用foo这个方法;我们可以这样设计;

def timeit(func):
    def wrapper():
        start= time.clock()
        func()
        end = time.clock()
        print 'used time', end-start
    return wrapper

foo = timeit(foo)# 这个还没有执行 xxxxx行
foo()# 才刚开始执行 yyyy行

在python 中为了简化xxxx行就有一种叫语法糖(装饰器@)的东西;可以直接在foo的方法定义前使用;

@timeit
def foo():
    ......

以上代码就是装饰模式的设计思想,就是在原来的东西上装饰了一些东西,结果本质上还是那个东西; 比如:一个白色的杯子,你只是给它刷了一层漆, 那么这个杯子还是杯子,而不是变成其他物品;所以,foo 在代码书写看来还是 foo, 而不是变成timeit(foo);

刚才我说了一个从代码上看来,foo还是foo, 其实从上面timeit(func)的实现来看,因为timeit返回的是一个wrapper方法,所以,foo本质上已经变成了wrapper了,那么怎么避免这点呢?所以python的提供了一个functools.wraps的装饰器;

如从新定义timeit()

def timeit(func):
    @functools.wraps(func)
    def wrapper():
        start = time.clock()
        func()
        end = time.clock()
        print 'used time', end-start

return wrapper

你可能感兴趣的:(python 装饰器@ 面向切面的编程)