python(十一)面向切面編程AOP和裝飾器


 

二、裝飾器

      裝飾器可以在給函數修改功能的同時並不改變這個函數本身。(以下用的都是python2.7)

      首先,在python里面函數是對象,在下面的函數里"fun"是函數也是對象可以傳遞給test。加括號才能執行函數[1]

def fun():
    print "run a test fun()"

fun()          #fun() 是執行函數
#輸出 "run a test fun()"

test = fun     #fun   是函數,可以進行傳遞
test()         #test() 也可以執行函數
#輸出 "run a test fun()"

     現在要給函數 fun() 修改增加一點功能, 但是又不改變fun() 這個函數本身,這時候可以用下面的 modify 函數對 fun() 進行調用,這

這樣既不改變 fun() 本身,還能增加功能。

def fun():
    print "run a test fun()"

def modify(function):        #這里的參數function可以用傳遞函數
    print "modify"
    function()               #因此傳遞的參數可以在這里執行


modify(fun)    #在這傳遞函數fun()
#輸出
#modify
#run a test fun()

test = modify
test(fun)
#輸出
#modify
#run a test fun()

       現在把上面的代碼用簡潔的方式實現相同的功能,只要把@加上函數名放在要修改的函數前面就有相同的功能,注意用來修飾的函數也就是下面的modify函數必須要有參數,而這個參數就是用來傳遞原來的函數用的。這個功能就是裝飾器,等於減少了手動創建原函數的過程。

        (下面會出現一點問題)

def modify(function):
    print "modify"
    function()

@modify
def fun():
    print "run a test fun()"

fun()    #但是這里執行不能用fun()了,得用fun
#輸出
#拋出異常fun()TypeError: 'NoneType' object is not callable
fun
#輸出
#modify
#run a test fun()

     這里如果要用fun() 執行函數的話,得將modify 函數改變一下, 在modify 函數里的function返回,改成如下

def modify(function):
    print "modify"
    return function

@modify
def fun():
    print "run a test function"

fun()
#輸出
#modify
#run a test function

       為什么會出現上面問題呢,接下要講講這個@+函數名的語法糖的工作原理

      ...(暫時沒有找到講原理的參考文)

 


參考:

  [1] Mr.Seven

      http://www.cnblogs.com/wupeiqi/articles/4980620.html

--------------------謝謝大佬打賞--------------------------

 


免責聲明!

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



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