裝飾器是這樣一種設計模式:如果一個類希望添加其他類的一些功能,而不希望通過繼承或是直接修改源代碼實現(xiàn),那么可以使用裝飾器模式。簡單來說Python中的裝飾器就是指某些函數(shù)或其他可調(diào)用對象,以函數(shù)或類作為可選輸入?yún)?shù)梧田,然后返回函數(shù)或類的形式。通過這個在Python2.6版本中被新加入的特性可以用來實現(xiàn)裝飾器設計模式侧蘸。
順便提一句裁眯,在繼續(xù)閱讀之前,如果你對Python中的閉包(Closure)概念不清楚闺魏,可以參考博文:http://www.cnblogs.com/vamei/archive/2012/12/15/2772451.html
在Python中,裝飾器被用于用@語法糖修辭的函數(shù)或類「┗現(xiàn)在讓我們用一個簡單的裝飾器例子來演示如何做一個函數(shù)調(diào)用日志記錄器析桥。在這個例子中,裝飾器將時間格式作為輸入?yún)?shù)艰垂,在調(diào)用被這個裝飾器裝飾的函數(shù)時打印出函數(shù)調(diào)用的時間泡仗。這個裝飾器當你需要手動比較兩個不同算法或?qū)崿F(xiàn)的效率時很有用。
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
通過使用函數(shù)來展示運行:
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
#############結(jié)果###################
<type 'function'> <type 'function'> decorator
<type 'function'> <type 'function'> add1
- Running 'add1' on 2015/12/31 - 15:40:08
- Finished 'add1', executing time = 1.000s
<type 'int'> <type 'int'>
3
在該結(jié)果中能清晰的看到函數(shù)是如何一步一步運行的猜憎。