首先,什么是函數修飾符?函數修飾符就是對原有函數做一層包裝。比如有以下兩個函數:
復制代碼
- def func1():
- print 'I am function func1'
- def func2():
- print 'I am function func2'
|
現在我們想為這兩個函數增加一段共同的操作,這時就可以使用函數修飾符。首先我們定義一個修飾函數,先不做任何處理,僅僅打印一條橫線:
復制代碼
- def de( f )
- def call_():
- print '-------------------------------'
- return f()
- return _call_
|
使用這個修飾符:
復制代碼
- def de( f ):
- def _call_():
- print '-------------------------------'
- return f()
- return _call
- @de
- def func1():
- print 'I am function func1'
- @de
- def func2():
- print 'I am function func2'
- if name
= '__main__':
func1()
func2()
|
運行結果為:
復制代碼
- d:\我的文檔\桌面>b.py
- -------------------------------
- I am function func1
- -------------------------------
- I am function func2
- d:\我的文檔\桌面>
|
可以看到,修飾符起作用了。
注意:
1.修飾符等價於包裝調用:
- @de
- def func1:
- ----- 等價於 ------
- func1 = de( func1 )
|
2.修飾函數必須返回一個“可調用對象”:
- def de( f ):
- def call_():
- return f()
- return _call # 返回的是一個函數體,而非調用_call_()
|
下一個問題:如果各個被修飾函數有不同的參數,怎么處理呢?例如:
- def func1( lst1, lst2 ):
- # 合並兩個list,並打印各項
- for item in lst1+lst2:
- print item
- def func2( dic ):
- # 循環dict,打印各key-value
- for k, v in dic.items():
- print k, v
|
這兩個函數參數不同,又都沒有異常處理,現在我們想增加上,使用修飾符這樣處理:
- import sys
- import traceback
- def de( f ):
- def call_( *args, **kwargs ):
- try:
- return f( *args , **kwargs )
- except:
- print 'param type error'
- return _call
- @de
- def func1( lst1, lst2 ):
- for item in lst1+lst2:
- print item
- @de
- def func2( dic ):
- for k, v in dic.items():
- print k, v
- if name = '__main__':
- func1( [1,2], [3,4] )
- func2( [1,2] )
|
這里使用了可變參數*args和**kwargs,這樣會把所有接收來的參數,原樣不動的再轉給原函數,是慣用法。
以上程序運行結果:
復制代碼
- d:\我的文檔\桌面>b.py
- 1
- 2
- 3
- 4
- param type error
- d:\我的文檔\桌面>