python基礎-裝飾器

記錄自己學習py基礎的點點滴滴

裝飾器

  • 由淺入深,先定義一個函數(shù),把這個函數(shù)賦值給一個變量,然后可以通過變量直接調(diào)用函數(shù)
def woami():
    print('xiaoyang')

f = woami
f()
xiaoyang
  • 函數(shù)有個name屬性,可以看到賦值給變量并沒有改變函數(shù)的name屬性
woami.__name__
'woami'
woami.__name__
'woami'
  • 現(xiàn)在我們要增強woami函數(shù)的功能,或者增強任意一個函數(shù)的功能,在不改變函數(shù)定義的情況下,這種在代碼運行期間動態(tài)增加函數(shù)功能的方式稱之為裝飾器(decorator)
  • 事實上裝飾器在做的事,是接受當前函數(shù)作為參數(shù),返回一個新的函數(shù)出來,本質(zhì)上是一個返回函數(shù)的高階函數(shù)
def log(func):
        def new(*args, **kw):
                print('call %s:'  % func.__name__)
                return func(*args, **kw)
        return new
  • 可以看出裝飾器,就是上面說的一個函數(shù)而已,要讓他起到上述裝飾器真正的作用需要使用
    @ 我們就稱它為修飾符號吧
@log
def woami():
        print('xiaoyang')

woami()
call woami():
xiaoyang
  • @log的作用等同于下面這行
woami = log(woami)
  • 請注意裝飾器返回了一個新函數(shù)new,所以被裝飾器修飾過的woami,已經(jīng)不是原來的woami了,而是一個新的函數(shù),我們來驗證一下
woami.__name__
'new'

很神奇對吧,別慌,我們接著看,再來修飾一個函數(shù)玩玩吧

@log
def again():
        print('又來~')

again()
call again:
又來

可以看到,我們之前定義好的返回函數(shù)log,在定義任何函數(shù)之前@一下,就可以起到修飾的作用了。很好,掌握了裝飾器的初級用法,很開心。。。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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