亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

簡單上手Python中裝飾器的使用

 更新時間:2015年07月12日 12:16:53   作者:Yi_Zhi_Yu  
這篇文章主要介紹了Python中裝飾器的使用,是Python進階學(xué)習(xí)中的重要知識,需要的朋友可以參考下

Python的裝飾器可以實現(xiàn)在代碼運行期間修改函數(shù)的上下文, 即可以定義函數(shù)在執(zhí)行之前進行何種操作和函數(shù)執(zhí)行后進行何種操作, 而函數(shù)本身并沒有任何的改變。

這個看起來很復(fù)雜, 實際上應(yīng)用到了我之前說過的閉包的概念, 仔細(xì)看一看, 其實并不復(fù)雜。

首先, 我們先定義一個函數(shù), 這個函數(shù)可以輸出我的個人昵稱:

def my_name():
  print "Yi_Zhi_Yu"
my_name() # Yi_Zhi_Yu

那假如我需要在個人昵稱輸出前, 在輸出我的個人uid呢, 當(dāng)然, 要求是不改動現(xiàn)有的my_name函數(shù), 這個時候就可以使用裝飾器了

首先, 裝飾器也是個函數(shù), 其次, 他需要接受一個參數(shù),該參數(shù)表示了要被裝飾的函數(shù)(即my_name):

def my_info(func):
  def wrapper(*args, **params):
    print 218
    return func(*args, **params)
  return wrapper

然后與相應(yīng)的被裝飾函數(shù)關(guān)聯(lián)起來的方法就是使用@my_info寫在被裝飾函數(shù)的前面

@my_info
def my_name():
  print "Yi_Zhi_Yu"

最后, 在執(zhí)行my_name的時候, 就能既輸出我的uid, 又能輸出我的昵稱了

my_name()
#218
#Yi_Zhi_Yu

在上面, 最讓我們疑惑的是裝飾器函數(shù)定義里面的wrapper函數(shù), 裝飾器本身返回的是wrapper函數(shù)的定義, 而wrapper中則定義了對被裝飾函數(shù)(my_name)的調(diào)用, func表示的就是被裝飾函數(shù), 說白了, 裝飾器只是把某個不得改動的函數(shù)(a)放到另一個函數(shù)(b)中, 在b里面調(diào)用a, 在調(diào)用前后就可以做所謂的看起來像裝飾的工作了。
my_info的最終返回的wrapper函數(shù)的定義, 并不是執(zhí)行結(jié)果,只有當(dāng)wrapper真正執(zhí)行的時候, 才會真正的執(zhí)行my_name方法, 這就是閉包時所說的內(nèi)容。
wrapper中的參數(shù), 實際上則是傳遞給func(實際上是my_name)的參數(shù)

因為裝飾器也是個函數(shù), 那么裝飾器自己的能不能有參數(shù)傳遞呢??梢裕?不過需要定義一個更高階的函數(shù), 也就是外面還要套一層函數(shù), 比如, 我還要輸出我的自定義的一個信息,需要傳遞參數(shù)

def c_info(text):
  def my_info(func):
    def wrapper(*args, **params):
      print text
      print 218
      return func(*args, **params)
    return wrapper
  return my_info

 #使用裝飾器
 @c_info("Tony")
 def my_name():
  print "Yi_Zhi_Yu"

 my_name()
 #Tony
 #218
 #Yi_Zhi_Yu

與前面的那個裝飾器相比, 僅僅是多了個外層, 內(nèi)層也僅僅是增加了對外層傳入?yún)?shù)(text)的調(diào)用

總而言之, Python在函數(shù)定義中支持了對oop思想中的裝飾器的實現(xiàn), 其本質(zhì)也只是使用了閉包的思路, 延遲調(diào)用, 并在調(diào)用前后增加自己的其他實現(xiàn)內(nèi)容

相關(guān)文章

  • Python定時從Mysql提取數(shù)據(jù)存入Redis的實現(xiàn)

    Python定時從Mysql提取數(shù)據(jù)存入Redis的實現(xiàn)

    這篇文章主要介紹了Python定時從Mysql提取數(shù)據(jù)存入Redis的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • 探索Python元類與class語句協(xié)議掌握類的控制權(quán)

    探索Python元類與class語句協(xié)議掌握類的控制權(quán)

    這篇文章主要介紹了通過Python元類與class語句協(xié)議掌握類的控制權(quán)探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • python:目標(biāo)檢測模型預(yù)測準(zhǔn)確度計算方式(基于IoU)

    python:目標(biāo)檢測模型預(yù)測準(zhǔn)確度計算方式(基于IoU)

    今天小編就為大家分享一篇python:目標(biāo)檢測模型預(yù)測準(zhǔn)確度計算方式(基于IoU),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • 淺談python中的多態(tài)

    淺談python中的多態(tài)

    在面向?qū)ο蟪绦蛟O(shè)計中,除了封裝和繼承特性外,多態(tài)也是一個非常重要的特性。讓具有不同功能的函數(shù)可以使用相同的函數(shù)名,這樣就可以用一個函數(shù)名調(diào)用不同內(nèi)容(功能)的函數(shù)
    2021-06-06
  • Python常用GUI框架原理解析匯總

    Python常用GUI框架原理解析匯總

    這篇文章主要介紹了Python常用GUI框架原理解析匯總,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-12-12
  • python多版本工具miniconda的配置優(yōu)化實現(xiàn)

    python多版本工具miniconda的配置優(yōu)化實現(xiàn)

    通過Miniconda,您可以輕松地創(chuàng)建和管理多個Python環(huán)境,同時確保每個環(huán)境具有所需的依賴項和軟件包,本文主要介紹了python多版本工具miniconda的配置優(yōu)化實現(xiàn),感興趣的可以了解一下
    2024-01-01
  • 解決新django中的path不能使用正則表達(dá)式的問題

    解決新django中的path不能使用正則表達(dá)式的問題

    今天小編就為大家分享一篇解決新django中的path不能使用正則表達(dá)式的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python利用PyPDF2庫獲取PDF文件總頁碼實例

    Python利用PyPDF2庫獲取PDF文件總頁碼實例

    這篇文章主要介紹了Python利用PyPDF2庫獲取PDF文件總頁碼實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • pytorch模型的保存加載與續(xù)訓(xùn)練詳解

    pytorch模型的保存加載與續(xù)訓(xùn)練詳解

    這篇文章主要為大家介紹了pytorch模型的保存加載與續(xù)訓(xùn)練詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Python實現(xiàn)輕松識別數(shù)百個快遞單號

    Python實現(xiàn)輕松識別數(shù)百個快遞單號

    當(dāng)我們要寄出很多快遞時,為了及時反饋物流信息,需要盡快將快遞單號提取出來。這時用手動去識別真的太麻煩,所以本文將用Python實現(xiàn)輕松識別數(shù)百個快遞單號,需要的可以參考一下
    2022-06-06

最新評論