python裝飾器簡單入門

最近在看OpenStack源代碼的時候看到裝飾器的使用,以前沒有遇到過,所以學習一下,順便記錄一下。
裝飾器的作用:
裝飾器就是把函數包裝一下,爲函數添加一些附加功能,裝飾器就是一個函數,參數爲被包裝的函數,返回包裝後的函數

裝飾器用法示例:
1,沒有參數的裝飾器

沒有參數的裝飾器會直接接受原函數作爲參數,定義如下:

def deco(func):
    if func.__doc__ == None:
        print func,'has no __doc__,its a bad habit.'
    else:
        print func,':',func.__doc__,'.'
    return func

#在這時已經開始運行裝飾器
@deco
def func1():
    'I have a __doc__'
    print 'func1 is running'

@deco
def func2():
    print 'func2 is running'

func1()
func2()

###########輸出結果:###########
<function func1 at 0x0000000002ACD9E8> : I have a __doc__ .
<function func2 at 0x0000000002AD3048> has no __doc__,its a bad habit.
func1 is running
func2 is running

如果去掉最後的func1()和func2()的調用,會輸出結果的前兩句。所以裝飾器在語句:@deco然後定義函數之後已經開始運行,但是原函數要等到調用時才運行。

2,有參數的裝飾器
這是裝飾器函數不能把原函數名當做參數傳入,必須在裏面再創建一個裝飾器接受原函數名作爲參數。定義如下:
def outerdeco(args):
    def innerdeco(func):
        print func,args
        return func
    return innerdeco

@outerdeco('outerdeco-args')
def func3():
    print 'func3 is running'

func3()

############輸出結果:###########
<function func3 at 0x0000000002B61198> outerdeco-args
func3 is running

3,裝飾器有參數且函數也有參數的裝飾器:
最外層的裝飾器帶着自己的參數,中間的裝飾器接收原函數名作爲參數,最裏層的裝飾器接收原函數的參數作爲參數。定義如下:
def outerdeco4(args):
    def innerdeco4(func):
        def funcdeco(a,b):
            print func,args
            ret = func(a,b)
            return ret
        return funcdeco
    return innerdeco4

@outerdeco4('Add two numbers.')     
def func4(a,b):
    print 'The answer is :',a + b
    return a + b

func4(3,5)

########輸出結果:#######
<function func4 at 0x0000000002C92278> Add two numbers.
The answer is : 8

其他類型的裝飾器可以由此演變而來。

總結:
總之python裝飾器不過就是一個針對嵌套函數的語法。
它的作用就是在函數調用方法不變的情況下,把此函數包裝成另一個函數來使用
 。
裝飾器是一個很著名的設計模式,經常被用於有切面需求的場景,較爲經典的有插入日誌、性能測試、事務處理等。裝飾器是解決這類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量函數中與函數功能本身無關的雷同代碼並繼續重用。概括的講,裝飾器的作用就是爲已經存在的對象添加額外的功能。







發佈了47 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章