python 裝飾器與語法糖

要想了解裝飾器首先要了解閉包。
閉包:由外部函數(shù)與內(nèi)部函數(shù)組成,內(nèi)部函數(shù)通過調(diào)用外部函數(shù)的變量與返回內(nèi)部函數(shù)的引用形成閉包。如下代碼(因?yàn)楸救耸褂玫氖莗ython2.7的版本所以內(nèi)部函數(shù)使用外部函數(shù)的變量時(shí)使用的是mutable對(duì)象(可變對(duì)象,列表或者字典)對(duì)象。python3與python2的區(qū)別參見博客:http://www.jb51.net/article/78955.htm

def outer():
    count= [0]
    def inner():
        count[0] +=1
        print(count[0])
    return inner

上述例子中實(shí)現(xiàn)了一個(gè)函數(shù)調(diào)用功能自動(dòng)加1的功能。結(jié)果如下:

if __name__ =='__main__':
   a= outer()
   a()     //輸出1
   a()     //輸出2

裝飾器就是通過閉包來給原有函數(shù)增加新功能。例如我們通過給調(diào)用函數(shù)增加顯示調(diào)用次數(shù)的功能。

def outer(func):
    count= [0]
    def inner(a,b):
        count[0] +=1
        print(count[0])
        return func(a,b)
    return inner

def add(a,b):
    print("a + b value is %s" % (a+b))
    return

if __name__ =='__main__':
   a= outer(add)
   a(2,3)
   //1
   //  a + b value is 5
   a(3,4)
   //2
   //a + b value is 7

a = outer(add),則def outer(func)中的func = add
outer函數(shù) 返回的是內(nèi)部函數(shù)的引用,所以a = inner(a,b)
inner函數(shù)返回的為func(a,b),所以 a= add(a,b)
inner return func(a,b)前可以增加任意操作喲。

有些人認(rèn)為這樣a = outer(add) 不美觀,所以引用了語法糖,在需要添加功能的函數(shù)前加上 @outer 即可:

def outer(func):
    count= [0]
    def inner(a,b):
        count[0] +=1
        print(count[0])
        return func(a,b)
    return inner

@outer
def add(a,b):
    print("a + b value is %s" % (a+b))
    return

if __name__ =='__main__':
  
   add(2,3)
   //1
   //  a + b value is 5
   add(3,4)
   //2
   //a + b value is 7
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 呵呵!作為一名教python的老師,我發(fā)現(xiàn)學(xué)生們基本上一開始很難搞定python的裝飾器,也許因?yàn)檠b飾器確實(shí)很難懂...
    TypingQuietly閱讀 20,325評(píng)論 26 186
  • 原文出處: dzone 譯文出處:Wu Cheng(@nullRef) 1. 函數(shù) 在python中,函數(shù)通過...
    DraculaWong閱讀 589評(píng)論 0 3
  • Python的裝飾器的英文名叫Decorator,要對(duì)一個(gè)已有的模塊做一些“修飾工作”,所謂修飾工作就是想給現(xiàn)有的...
    Spareribs閱讀 749評(píng)論 1 11
  • GTD理論是戴維?艾倫《搞定》系列的精華所在,也是時(shí)間管理的重要理論。簡單歸納為“收集、加工、組織整理、回顧、執(zhí)行...
    八點(diǎn)水閱讀 2,299評(píng)論 1 12
  • 一位老鄉(xiāng)發(fā)了一個(gè)對(duì)聯(lián),說是全國最牛的一副對(duì)聯(lián),我看了認(rèn)為牛談不上,但確是很實(shí)在的一副對(duì)聯(lián),請(qǐng)看: 上聯(lián):愛妻,愛子...
    王繼新閱讀 513評(píng)論 0 2

友情鏈接更多精彩內(nèi)容