装饰器(decorators)

装饰器是这样一种设计模式:如果一个类希望添加其他类的一些功能,而不希望通过继承或是直接修改源代码实现,那么可以使用装饰器模式。简单来说Python中的装饰器就是指某些函数或其他可调用对象,以函数或类作为可选输入参数,然后返回函数或类的形式。通过这个在Python2.6版本中被新加入的特性可以用来实现装饰器设计模式。

顺便提一句,在继续阅读之前,如果你对Python中的闭包(Closure)概念不清楚,可以参考博文:http://www.cnblogs.com/vamei/archive/2012/12/15/2772451.html

在Python中,装饰器被用于用@语法糖修辞的函数或类。现在让我们用一个简单的装饰器例子来演示如何做一个函数调用日志记录器。在这个例子中,装饰器将时间格式作为输入参数,在调用被这个装饰器装饰的函数时打印出函数调用的时间。这个装饰器当你需要手动比较两个不同算法或实现的效率时很有用。

def logged(time_format):
    def decorator(func):
        def decorated_func(*args, **kwargs):
            print "- Running '%s' on %s " % (
                                func.__name__, time.strftime(time_format)
                                )
            start_time = time.time()
            result = func(*args, **kwargs)
            end_time = time.time()
            print "- Finished '%s', executing time = %0.3fs " % (
                                func.__name__, end_time - start_time)
            return result
        decorated_func.__name__ = func.__name__
        return decorated_func
    return decorator

@logged("%Y/%m/%d - %H:%M:%S")
def add1(x, y):
    time.sleep(1)
    return x + y

@logged("%Y/%m/%d - %H:%M:%S")
def add2(x, y):
    time.sleep(2)
    return x + y

print add1(1, 2)
print add2(1, 2)
############看看输出##################
- Running 'add1' on 2015/12/31 - 15:36:18 
- Finished 'add1', executing time = 1.000s 
3
- Running 'add2' on 2015/12/31 - 15:36:19 
- Finished 'add2', executing time = 2.000s 
3

通过使用函数来展示运行:

def add1(x, y):
    time.sleep(1)
    return x + y

a = logged("%Y/%m/%d - %H:%M:%S")
print type(a), a.__class__, a.__name__
b = a(add1)
print type(b), b.__class__, b.__name__
c = b(1, 2)
print type(c), c.__class__
print c
#############结果###################
  decorator
  add1
- Running 'add1' on 2015/12/31 - 15:40:08 
- Finished 'add1', executing time = 1.000s 
 
3

在该结果中能清晰的看到函数是如何一步一步运行的。

该文参考:http://blog.jobbole.com/66895/

你可能感兴趣的:(装饰器(decorators))