python裝飾器理解實例

什麼是裝飾器:
是一個修飾函數把原函數包裹在裝飾函數中,並且改變原函數的行爲但原函數本身不變。(可類比生活中同一個人要拍結婚照了需要多套衣服,每套衣服是變的,都需要重用參與者肉身並不能改變肉身,那麼就通過衣服把肉身包裹起來,然後完成各組拍照。衣服就是裝飾,怎麼實現換衣服並完成拍照就是裝飾器的作用)
函數裝飾器實例

import functools
def decorator(func):                 # 函數作爲參數傳入
    @functools.wraps(func)           # 解決原函數被替換爲test函數問題
    def test(*args,**kwargs):        #*args,**kwargs 不知道傳入的參數類型和數量,定義一個泛型
        print '-----------------------'     #在源函數前添加裝飾操作
        func(*args,**kwargs)           #在修飾函數中調用原函數
        print '======================='     #在源函數後添加裝飾操作
    return test         #閉包

@decorator                                #裝飾器調用語法糖
def testfunc(param,param1):       #原函數
    print "base func : " + param +" : "+ param1


testfunc('hahaha','22222222222')
print testfunc.__name__            #輸出原函數的名字testfunc

執行結果

-----------------------
base func : hahaha : 22222222222
=======================
testfunc

類裝飾器實例

class test:
    def __init__(self,func):
        self.func = func
        self.num_calls =0
        print '1111111111111111111111'
    def __call__(self, *args, **kwargs):
        print ">>>>>>>>>>111"
        self.num_calls +=1
        print ('num is :' + str(self.num_calls))
        return self.func(*args,**kwargs)

class test2:
    def __init__(self,func):
        self.func = func
        self.num_calls =0
        print '2222222222222222222'
    def __call__(self, *args, **kwargs):
        print '=============222222222222222'
        self.num_calls +=10
        print ('num is :' + str(self.num_calls))
        return self.func(*args,**kwargs)
@test
@test2
def example():
    print "aaaaaaaaaaaa"
example()

調用結果:

2222222222222222222
1111111111111111111111
>>>>>>>>>>111
num is :1
=============222222222222222
num is :10
aaaaaaaaaaaa

理解基礎:
1 函數是對象,函數可以賦值給變量
2 函數可以作爲參數傳入另一個函數中
3 函數嵌套,函數中定義函數
4 閉包,return 返回值是函數對象
5 @語法糖
6 實用場景:1 認證 2 日誌處理 3數據校驗 4單元測試時初始化和清理數據 5 併發、控制計數 等等來重用代碼但是不去改動重用塊的本身

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章