1. 程式人生 > >Python 函式修飾符(裝飾器)的使用

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

1.  修飾符的來源

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

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

如下:

import time

def timeslong(func):
    start = time.clock()
    print("It's time starting ! ")
    func()
    print("It's time ending ! ")
    end = time.clock()
    return "It's used : %s ." % (end - start)

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

如下:

import time

def timeslong(func):
    def call():
        start = time.clock()
        print("It's time starting ! ")
        func()
        print("It's time ending ! ")
        end = time.clock()
        return "It's used : %s ." % (end - start)
    return call

@timeslong
def f():
    y = 0
    for i in range(10):
        y = y + i + 1
        print(y)
    return y

print(f())

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

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

class timeslong(object):
def __init__(self,func):
    self.f = func
def __call__(self):
    start = time.clock()
    print("It's time starting ! ")
    self.f()
    print("It's time ending ! ")
    end = time.clock()
    return "It's used : %s ." % (end - start)

@timeslong
def f():
    y = 0
    for i in range(10):
        y = y + i + 1
        print(y)
    return y

print(f())

2.  Python內建的修飾符

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

class Hello(object):
    def __init__:
        ...

@classmethod
def print_hello(cls):
    print("Hello")

classmethod 修飾過後,print_hello() 就變成了類方法,可以直接通過 Hello.print_hello() 呼叫,而無需繫結例項物件了。