Python中的函數修飾符


首先,什么是函數修飾符?函數修飾符就是對原有函數做一層包裝。比如有以下兩個函數:

復制代碼
  1. def func1():
  2.     print 'I am function func1'
  3. def func2():
  4.     print 'I am function func2'


現在我們想為這兩個函數增加一段共同的操作,這時就可以使用函數修飾符。首先我們定義一個修飾函數,先不做任何處理,僅僅打印一條橫線:

復制代碼
  1. def de( f )
  2.     def call_():
  3.         print '-------------------------------'
  4.         return f()
  5.     return _call_


使用這個修飾符:

復制代碼
  1. def de( f ):
  2.     def _call_():
  3.         print '-------------------------------'
  4.         return f()
  5.     return _call
  6. @de
  7. def func1():
  8.     print 'I am function func1'
  9. @de
  10. def func2():
  11.     print 'I am function func2'
  12. if name = '__main__':
  13.     func1()
  14.     func2()


運行結果為:

復制代碼
  1. d:\我的文檔\桌面>b.py
  2. -------------------------------
  3. I am function func1
  4. -------------------------------
  5. I am function func2
  6. d:\我的文檔\桌面>


可以看到,修飾符起作用了。

注意:
1.修飾符等價於包裝調用:


  1. @de
  2. def func1:
  3. ----- 等價於 ------
  4. func1 = de( func1 )


2.修飾函數必須返回一個“可調用對象”:


  1. def de( f ):
  2.     def call_():
  3.         return f()
  4.     return _call # 返回的是一個函數體,而非調用_call_()



下一個問題:如果各個被修飾函數有不同的參數,怎么處理呢?例如:


  1. def func1( lst1, lst2 ):
  2.     # 合並兩個list,並打印各項
  3.     for item in lst1+lst2:
  4.         print item
  5. def func2( dic ):
  6.     # 循環dict,打印各key-value
  7.     for k, v in dic.items():
  8.         print k, v


這兩個函數參數不同,又都沒有異常處理,現在我們想增加上,使用修飾符這樣處理:


  1. import sys
  2. import traceback
  3. def de( f ):
  4.     def call_( *args, **kwargs ):
  5.         try:
  6.             return f( *args , **kwargs )
  7.         except:
  8.             print 'param type error'
  9.     return _call
  10. @de
  11. def func1( lst1, lst2 ):
  12.     for item in lst1+lst2:
  13.         print item
  14. @de
  15. def func2( dic ):
  16.     for k, v in dic.items():
  17.         print k, v
  18. if name = '__main__':
  19.     func1( [1,2], [3,4] )
  20.     func2( [1,2] )


這里使用了可變參數*args和**kwargs,這樣會把所有接收來的參數,原樣不動的再轉給原函數,是慣用法。
以上程序運行結果:
復制代碼

    1. d:\我的文檔\桌面>b.py
    2. 1
    3. 2
    4. 3
    5. 4
    6. param type error
    7. d:\我的文檔\桌面>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM