最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解python中的裝飾器

 更新時(shí)間:2018年07月10日 10:13:48   作者:孤月靈聲  
裝飾器是在不改變函數(shù)(當(dāng)然還有其他的)的代碼和調(diào)用方式的前提下,為函數(shù)增加新的功能,這篇文章給大家詳細(xì)介紹了python中的裝飾器,感興趣的朋友一起看看吧

在了解裝飾器之前,我們需要知道什么閉包是什么鬼!

閉包:在一個(gè)函數(shù)內(nèi)定義了一個(gè)函數(shù)f,并且這個(gè)函數(shù)f引用外部變量,在把這個(gè)函數(shù)f當(dāng)做返回值返回。

上述說(shuō)了閉包的三個(gè)條件:

1 函數(shù)內(nèi)定義了一個(gè)函數(shù)f

2 f函數(shù)引用了外部變量

3 f被當(dāng)做返回值返回

def t1():#定義t1函數(shù)
 x=2
 def f():#t1函數(shù)內(nèi)部定義了f函數(shù)
  print(x)#f函數(shù)引用了不屬于自己內(nèi)部的變量x
 return f #f被當(dāng)做返回值返回 

而裝飾器有是什么鬼呢?其實(shí)閉包的一種運(yùn)用。

裝飾器:在不改變函數(shù)(當(dāng)然還有其他的)的代碼和調(diào)用方式的前提下,為函數(shù)增加新的功能!

那么需求來(lái)了:例如我定義了一個(gè)下載方法,我在想不改變下載方法的代碼和調(diào)用方式,為其加一個(gè)需要登錄后才能下載的功能

def get(file):#下載方法
 print('下載成功',file)

那么如何實(shí)現(xiàn)呢?這里就要用到上面提到的閉包。

我們?cè)賮?lái)看看閉包,即是在一個(gè)函數(shù)內(nèi)定義了一個(gè)函數(shù)f,并且這個(gè)函數(shù)f引用外部變量,在把這個(gè)函數(shù)f當(dāng)做返回值返回

那么上面的需求我們可以先試著做第一步,即是不改變下載方法的代碼,為其加一個(gè)需要登錄后才能下載的功能

def get(file):#下載方法
 print('下載成功',file)
def auth(get,*args,**kwargs):
 print('登錄方法')
 get(*args,**kwargs)
auth(get,'a.txt')
#結(jié)果:
#登錄方法
#下載成功 a.txt

但是這樣的話(huà)調(diào)用方式改變了,那么我們可以利用閉包:

def get(file):#下載方法
 print('下載成功',file)
def func(get):
 def auth():
  print('登錄方法')
  get()
 return auth
get=func(get)
get('dasd')

這樣的話(huà),參數(shù)有傳不進(jìn)去,并且報(bào)錯(cuò)參數(shù)沒(méi)有接收到:

我們分析一下上面代碼 func(get)其實(shí)應(yīng)該是auth這函數(shù)名,那么get=func(get),就是把a(bǔ)uth賦值給get變量,即是次數(shù) get=auth,

那么 我們調(diào)用get('dasd') 即是auth('dasd'),即是我們需要修改auth函數(shù)

def get(file):#下載方法
 print('下載成功',file)
def func(get):
 def auth(file):
  print('登錄方法')
  get(file)
 return auth
get=func(get)
get('dasd')

這樣的話(huà)get('dasd')的時(shí)候就是調(diào)用auth('dasd'),那么會(huì)執(zhí)行登錄方法,并且執(zhí)行g(shù)et('dasd'),這里是真正的下載方法

優(yōu)化一下就是這樣的:

def auth(f):
 def wrapper(*args,**kwargs):
  print('其它功能或方法')
  f(*args,**kwargs)
 return wrapper

這樣的要裝飾get函數(shù)的時(shí)候,只需get=auth(get),這里第一個(gè)get是變量,第二個(gè)get是函數(shù)名,這樣就實(shí)現(xiàn)get不改變其的代碼和調(diào)用方式,為其增加功能。

在python中 get=auth(get),可以省略為:

def auth(f):
 def wrapper(*args,**kwargs):
  print('登錄方法')
  f(*args,**kwargs)
 return wrapper
@auth # 相當(dāng)于get=auth(get)
def get(file):#下載方法
 print('下載成功',file)

當(dāng)然上面是裝飾器的無(wú)參裝飾器,還有有參裝飾器:

#有參裝飾器
def authx(a):
 def auth(f):
  def wrapper(*args, **kwargs):
   if a=='a':
    print('登錄方法')
   else:
    print('adad')
   f(*args, **kwargs)
  return wrapper
 return auth

@authx('adas') # 相當(dāng)于get=auth(get) 當(dāng)然 a的值也傳入了
def get(file):#下載方法
 print('下載成功',file)

總結(jié)

以上所述是小編給大家介紹的python中的裝飾器,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Python初學(xué)者必備的文件讀寫(xiě)指南

    Python初學(xué)者必備的文件讀寫(xiě)指南

    今天給大家?guī)?lái)的是關(guān)于Python基礎(chǔ)的相關(guān)知識(shí),文章圍繞著Python文件讀寫(xiě)展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Python?PyJWT庫(kù)簡(jiǎn)化JSON?Web?Token的生成與驗(yàn)證

    Python?PyJWT庫(kù)簡(jiǎn)化JSON?Web?Token的生成與驗(yàn)證

    PyJWT庫(kù)為Python開(kāi)發(fā)者提供了簡(jiǎn)便的生成和驗(yàn)證JWT的工具,本文將深入介紹PyJWT庫(kù)的核心概念、功能以及實(shí)際應(yīng)用,通過(guò)豐富的示例代碼,幫助大家更全面地了解和應(yīng)用這一強(qiáng)大的JWT庫(kù)
    2023-12-12
  • Python超越函數(shù)積分運(yùn)算以及繪圖實(shí)現(xiàn)代碼

    Python超越函數(shù)積分運(yùn)算以及繪圖實(shí)現(xiàn)代碼

    今天小編就為大家分享一篇Python超越函數(shù)積分運(yùn)算以及繪圖實(shí)現(xiàn)代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11
  • Python 如何讀取字典的所有鍵-值對(duì)

    Python 如何讀取字典的所有鍵-值對(duì)

    這篇文章主要介紹了Python 讀取字典的所有鍵-值對(duì)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Selenium?4.2.0?標(biāo)簽定位8種方法詳解

    Selenium?4.2.0?標(biāo)簽定位8種方法詳解

    這篇文章主要介紹了Selenium?4.2.0?標(biāo)簽定位8種方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • Python實(shí)現(xiàn)自動(dòng)識(shí)別并填加驗(yàn)證碼的示例代碼

    Python實(shí)現(xiàn)自動(dòng)識(shí)別并填加驗(yàn)證碼的示例代碼

    實(shí)現(xiàn)自動(dòng)識(shí)別網(wǎng)頁(yè)中的驗(yàn)證碼并填寫(xiě),需要結(jié)合使用網(wǎng)絡(luò)爬蟲(chóng)技術(shù)、圖像識(shí)別(OCR),以及可能的瀏覽器自動(dòng)化工具(如Selenium),本文給大家介紹了Python實(shí)現(xiàn)自動(dòng)識(shí)別并填加驗(yàn)證碼的示例,需要的朋友可以參考下
    2024-06-06
  • python中__set_name__的具體使用

    python中__set_name__的具體使用

    在Python中,我們可以通過(guò)__set_name__方法來(lái)實(shí)現(xiàn)一些特殊的操作,本文主要介紹如何在Python中實(shí)現(xiàn)__set_name__方法,并且給出一些實(shí)際應(yīng)用的示例,感興趣的可以了解一下
    2024-01-01
  • Python爬取某平臺(tái)短視頻的方法

    Python爬取某平臺(tái)短視頻的方法

    這篇文章主要介紹了Python爬取某平臺(tái)短視頻的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Python下調(diào)用Linux的Shell命令的方法

    Python下調(diào)用Linux的Shell命令的方法

    有時(shí)候難免需要直接調(diào)用Shell命令來(lái)完成一些比較簡(jiǎn)單的操作,這篇文章主要介紹了Python下調(diào)用Linux的Shell命令的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • python破解bilibili滑動(dòng)驗(yàn)證碼登錄功能

    python破解bilibili滑動(dòng)驗(yàn)證碼登錄功能

    這篇文章主要介紹了python破解bilibili滑動(dòng)驗(yàn)證碼登錄功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論

来宾市| 安乡县| 阜宁县| 阿拉善右旗| 阿荣旗| 贵港市| 新野县| 台安县| 孝昌县| 上饶市| 新民市| 和平县| 盖州市| 和平县| 大洼县| 轮台县| 丽水市| 义乌市| 汉川市| 颍上县| 庄浪县| 安徽省| 湖州市| 泸西县| 石河子市| 湄潭县| 深水埗区| 定陶县| 张北县| 嘉兴市| 兰坪| 湄潭县| 恩施市| 澳门| 罗城| 梓潼县| 西林县| 阳朔县| 墨脱县| 黎平县| 浦城县|