記錄自己學(xué)習(xí)py基礎(chǔ)的點點滴滴
裝飾器
- 由淺入深蒸痹,先定義一個函數(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)
- 事實上裝飾器在做的事,是接受當(dāng)前函數(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ù)之前@一下啄清,就可以起到修飾的作用了。很好俺孙,掌握了裝飾器的初級用法辣卒,很開心。睛榄。荣茫。