二、裝飾器
裝飾器可以在給函數修改功能的同時並不改變這個函數本身。(以下用的都是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
--------------------謝謝大佬打賞--------------------------