Python 函數修飾符(裝飾器)的使用


1.  修飾符的來源

借用一個博客上的一段敘述:修飾符是一個很著名的設計模式,經常被用於有切面需求的場景,較為經典的有插入日志、性能測試、事務處理等。

修飾符是解決這類問題的絕佳設計,有了修飾符,我們就可以抽離出大量函數中與函數功能本身無關的雷同代碼並繼續重用。概括的講,修飾符的作用就是為已經存在的對象添加額外的功能。

如下:

  1. import time
  2. def timeslong(func):
  3.     start = time.clock()
  4.     print("It's time starting ! ")
  5.     func()
  6.     print("It's time ending ! ")
  7.     end = time.clock()
  8.     return "It's used : %s ." % (end - start)
復制代碼


上面的程序中,定義了一個函數,對另外一個對象的運行時間進行計算,如果采用通常的方式需要將 func() 重新在 timeslong 中重新寫一遍。為了簡化這種操作,便提出了修飾符的概念。

如下:

  1. import time
  2. def timeslong(func):
  3.     def call():
  4.         start = time.clock()
  5.         print("It's time starting ! ")
  6.         func()
  7.         print("It's time ending ! ")
  8.         end = time.clock()
  9.         return "It's used : %s ." % (end - start)
  10.     return call
  11. @timeslong
  12. def f():
  13.     y = 0
  14.     for i in range(10):
  15.         y = y + i + 1
  16.         print(y)
  17.     return y
  18. print(f())
復制代碼


這樣出現便不用再函數內部再進行嵌入函數,通過 @timeslong 對其進行修飾達到目的,是整個代碼美觀,而且少些部分代碼。

修飾符也可以通過類來進行使用,共享該類,如下為一個實例:

  1. class timeslong(object):
  2. def __init__(self,func):
  3.     self.f = func
  4. def __call__(self):
  5.     start = time.clock()
  6.     print("It's time starting ! ")
  7.     self.f()
  8.     print("It's time ending ! ")
  9.     end = time.clock()
  10.     return "It's used : %s ." % (end - start)
  11. @timeslong
  12. def f():
  13.     y = 0
  14.     for i in range(10):
  15.         y = y + i + 1
  16.         print(y)
  17.     return y
  18. print(f())
復制代碼



2.  Python內置的修飾符

內置的修飾符有三個,分別是 staticmethod、classmethod 和 property,作用分別是把類中定義的實例方法變成靜態方法、類方法和類屬性。由於模塊里可以定義函數,所以靜態方法和類方法的用處並不是太多。

  1. class Hello(object):
  2.     def __init__:
  3.         ...
  4. @classmethod
  5. def print_hello(cls):
  6.     print "Hello"
復制代碼


classmethod 修飾過后,print_hello() 就變成了類方法,可以直接通過 Hello.print_hello() 調用,而無需綁定實例對象了。


免責聲明!

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



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