從一開始學習python的時候,就一直不是很理解裝飾器是個什麼東東,再看了不少篇博文和本身動手敲了好多代碼後,算是略有了解。html
我理解的裝飾器是: 在不改變原有函數調用的狀況下,對其進行包裝,使其變成另一種函數來使用,通常的用途是 插入日誌、性能測試、事務處理等。python
def host_restrict(tags=[], names=[]): def decorator(f): @functools.wraps(f) def decorated(*args, **kwargs): host_info = hosts.get(env.host) if not host_info: return f(*args, **kwargs) if tags and host_info[0] not in tags: raise StandardError('Tag %s not in %s' % (host_info[0], tags)) if names and not set(names).intersection( set([s for s in host_info[1].split(' ') if s.strip()])): raise StandardError( 'Name %s not in %s' % (host_info[1], names)) return f(*args, **kwargs) return decorated return decorator
公司的這個裝飾器是用來約束 用戶輸入的信息的。編程
特此記錄裝飾器的用法,把裝飾器分爲 有參數的裝飾器、無參數的裝飾器和functions模塊。app
1 無參數的裝飾器ide
def foo1(func): def decorator(): print '一些列相關操做' return func() return decorator
2 有參數的裝飾器函數
2.1 原函數帶參數性能
def foo1(func): def decorator(*args,**kwargs): print '一些列相關操做' return func(*args,**kwargs) return decorator
2.2 裝飾器帶參數 學習
# arg爲裝飾器的參數 def foo3(arg): def decorator(func): def decoratod(*args,**kwargs): print '能夠對arg進行判斷,計算等相關操做' return func(*args,**kwargs) return decoratod return decorator
3 functions 模塊測試
這個裝飾器能將裝飾過的函數的特殊屬性保留。通常在使用反射的使用會頗有用。.net
# arg爲裝飾器的參數 def foo4(arg): def decorator(func): @functools.wraps(func) def decoratod(*args,**kwargs): print '能夠對 arg 進行一些判斷等相關操做' return func(*args,**kwargs) return decoratod return decorator
下面是參考資料,當初有很多地方沒看明白,真正練習後才明白些:
1. Python裝飾器學習 http://blog.csdn.net/thy38/article/details/4471421
2. Python裝飾器與面向切面編程 http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html
3. Python裝飾器的理解 http://apps.hi.baidu.com/share/detail/17572338
4. Python裝飾器學習(九步學習) http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html