欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python閉包和裝飾器你了解嗎

 更新時(shí)間:2021年08月31日 18:11:30   作者:未末0902  
這篇文章主要為大家詳細(xì)介紹了Python的閉包和裝飾器,何為閉包?何為裝飾器?感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

一、閉包

1. 什么是閉包?

在函數(shù)中可以(嵌套)定義另一個(gè)函數(shù)時(shí),如果內(nèi)部的函數(shù)引用了外部的函數(shù)的變量,則可能產(chǎn)生 閉包。

閉包可以用來(lái)在一個(gè)函數(shù)與一組“私有”變量之間創(chuàng)建關(guān)聯(lián)關(guān)系。

在給定函數(shù)被多次調(diào)用的過(guò)程中,這些私有變量能夠保持其持久性。

2. 形成閉包的三個(gè)條件(缺一不可)

必須有一個(gè)內(nèi)嵌函數(shù)(函數(shù)里定義的函數(shù))——這對(duì)應(yīng)函數(shù)之間的嵌套

內(nèi)嵌函數(shù)必須引用一個(gè)定義在閉合范圍內(nèi)(外部函數(shù)里)的變量——內(nèi)部函數(shù)引用外部變量

外部函數(shù)必須返回內(nèi)嵌函數(shù)——必須返回那個(gè)內(nèi)部函數(shù)

換句話(huà)說(shuō):

其實(shí),閉包的概念很簡(jiǎn)單:一個(gè)可以引用在函數(shù)閉合范圍內(nèi)變量的函數(shù)。即"內(nèi)部函數(shù)",只有那個(gè)內(nèi)部函 數(shù)才有所謂的__closure__屬性。

3. 閉包的原理

形成閉包之后,閉包函數(shù)會(huì)獲得一個(gè)非空的__closure__屬性(對(duì)比我們最后的函數(shù)test,test是一 個(gè)不具備閉包的函數(shù),它的__closure__屬性是None),這個(gè)屬性是一個(gè)元組。

組里面的對(duì)象為cell對(duì)象,而訪(fǎng)問(wèn)cell對(duì)象的cell_contents屬性則可以得到閉包變量的當(dāng)前值 (即上一次調(diào)用之后的值)。

而隨著閉包的繼續(xù)調(diào)用,變量會(huì)再次更新。

所以可見(jiàn),一旦形成閉包之后,python確實(shí)會(huì)將__closure__和閉包函數(shù)綁定作為儲(chǔ)存閉包變量的場(chǎng)所

4. 閉包的好處

閉包不是必須的。

沒(méi)了閉包,python的功能一點(diǎn)不會(huì)被影響

有了閉包,只是提供給你一種額外的解決方案。

二、裝飾器

1. 什么是裝飾器

飾器是這樣一種設(shè)計(jì)模式:如果一個(gè)類(lèi)(函數(shù))希望添加其他類(lèi)(函數(shù))的一些功能,而不希望 通過(guò)繼承或是直接修改源代碼實(shí)現(xiàn),那么可以使用裝飾器模式。

簡(jiǎn)單來(lái)說(shuō)Python中的裝飾器就是指某些函數(shù)或其他可調(diào)用對(duì)象,以函數(shù)或類(lèi)作為可選輸入?yún)?shù), 然后返回函數(shù)或類(lèi)的形式。通過(guò)這個(gè)在Python2.6版本中被新加入的特性可以用來(lái)實(shí)現(xiàn)裝飾器設(shè)計(jì) 模式。

飾器就是一個(gè)可以接受調(diào)用也可以返回調(diào)用的函數(shù),該函數(shù)接受被裝飾的函數(shù)作為其位置參數(shù)。 裝飾器通過(guò)使用該參數(shù)來(lái)執(zhí)行某些操作,然后返回原始參數(shù)或一些其他的調(diào)用

函數(shù)也是對(duì)象,也可以當(dāng)做參數(shù)傳遞

2. 裝飾器有什么用

可以考慮在裝飾器中置入通用功能的代碼來(lái)降低程序復(fù)雜度。例如,可以用裝飾器來(lái):

引入日志

增加計(jì)時(shí)邏輯來(lái)檢測(cè)性能

給函數(shù)加入事務(wù)的能力

權(quán)限控制

3. 小 練 習(xí)

這里有個(gè)小練習(xí),可以來(lái)試試哈 >-<

用裝飾器實(shí)現(xiàn)權(quán)限控制

定義一個(gè)全局變量:username

定義add函數(shù),實(shí)現(xiàn)兩個(gè)數(shù)相加

實(shí)現(xiàn)login_required裝飾器,如果username值為root,提示"歡迎" 并計(jì)算結(jié)果,否則"沒(méi)有權(quán)限

代碼如下(示例):

三. 編寫(xiě)和使用裝飾器

1. 小案例

應(yīng)用多個(gè)裝飾器

2.應(yīng)用注意事項(xiàng)

應(yīng)用多個(gè)裝飾器

封裝時(shí),至下而上

執(zhí)行時(shí),至上而下

在實(shí)際應(yīng)用的場(chǎng)景中,當(dāng)我們采用上面的方式寫(xiě)了兩個(gè)裝飾方法比如先驗(yàn)證有沒(méi)有登錄 @login_required , 再驗(yàn)證權(quán)限夠不夠時(shí) @permision_allowed

3.保留元數(shù)據(jù)-什么是元數(shù)據(jù)

元數(shù)據(jù)(Metadata),又稱(chēng)中介數(shù)據(jù)、中繼數(shù)據(jù),為描述數(shù)據(jù)的數(shù)據(jù)(data about data),主要是 描述數(shù)據(jù)屬性(property)的信息

函數(shù)的重要的元信息比如名字、文檔字符串、注解和參數(shù)簽名等

4.保留元數(shù)據(jù)-裝飾器后為什么元數(shù)據(jù)會(huì)丟失

因?yàn)閞eturn執(zhí)行的,是經(jīng)過(guò)調(diào)用封裝后的函數(shù)

5.保留元數(shù)據(jù)

利用**@functools.wraps(fun)**,將一個(gè)函數(shù)的重要內(nèi)容復(fù)制到另一個(gè)函數(shù)

溫馨提醒:任何時(shí)候你定義裝飾器的時(shí)候,都應(yīng)該使用 functools 庫(kù)中的 @wraps 裝飾器來(lái)注解底層 包裝函數(shù)。

6.小案例

在這里插入圖片描述

7.內(nèi)置的裝飾器

Python還提供了類(lèi)裝飾器與**@staticmethod**,@classmethod,@property和這三個(gè)在面向?qū)ο缶?程中常用的裝飾器

staticmethod:把類(lèi)中定義的實(shí)例方法變成靜態(tài)方法

classmethod:把類(lèi)中定義的實(shí)例方法變成類(lèi)方法

property:把類(lèi)中定義的實(shí)例方法變成類(lèi)屬性。

四. 裝飾器的應(yīng)用

1.為什么使用裝飾器

模塊化且清晰明確

代碼重用

裝飾器是顯式的,增強(qiáng)可讀性

2.在何處使用裝飾器

Python標(biāo)準(zhǔn)庫(kù)中包括很多包含裝飾器的模塊,并且很多常用工具和框架利用它們實(shí)現(xiàn)常功能,如,

要使用一個(gè)類(lèi)上的方法不需要這個(gè)類(lèi)的實(shí)例(@classmethod或@staticmethod)

mock模塊(單元測(cè)試python3.3后加入標(biāo)準(zhǔn)庫(kù)-@mock.patch或@mock.patch.object)

Django(@login_required, @permission_reqired)

Flask(@app.route) 充當(dāng)url與函數(shù)之間的注冊(cè)表

Celery(@task) 返回Task類(lèi)實(shí)例

插入日志、性能測(cè)試、事務(wù)處理、緩存、權(quán)限校驗(yàn)等場(chǎng)景

記錄結(jié)果、增加計(jì)時(shí)邏輯來(lái)檢測(cè)性能等

五. 課后作業(yè)

1.實(shí)現(xiàn)函數(shù)注冊(cè)表

在這里插入圖片描述

2.完善三創(chuàng)購(gòu)物系統(tǒng)

所有用戶(hù)存放在Excel中(用戶(hù)名,密碼,余額)

定義裝飾器login_required,給需要的功能添加裝飾器

查看超市物品,不需要登錄 • 購(gòu)物及查看余額,需要登錄

先驗(yàn)證用戶(hù)是否已經(jīng)登錄(如果用戶(hù)未登錄提示“用戶(hù)未登錄,請(qǐng)登錄后重試”,并跳 轉(zhuǎn)到功能菜單)

總結(jié)

對(duì)于閉包的原理和好處十分重要,尤其是原理部分一定要好好消化一下,應(yīng)用很廣泛。

對(duì)于裝飾器部分,要了解它是怎么應(yīng)用的,在什么時(shí)候,什么地方應(yīng)用,多寫(xiě)幾個(gè)案例就明白了。

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)從字典中提取子集的方法示例

    Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)從字典中提取子集的方法示例

    這篇文章主要介紹了Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)從字典中提取子集的方法,涉及Python字典推導(dǎo)式的相關(guān)使用技巧,需要的朋友可以參考下
    2018-03-03
  • Django drf請(qǐng)求模塊源碼解析

    Django drf請(qǐng)求模塊源碼解析

    APIView中的dispatch是整個(gè)請(qǐng)求生命過(guò)程的核心方法,包含了請(qǐng)求模塊,權(quán)限驗(yàn)證,異常模塊和響應(yīng)模塊,我們先來(lái)介紹請(qǐng)求模塊,對(duì)Django drf請(qǐng)求模塊源碼相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-06-06
  • 常見(jiàn)python正則用法的簡(jiǎn)單實(shí)例

    常見(jiàn)python正則用法的簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)?lái)一篇常見(jiàn)python正則用法的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • python爬取豆瓣電影TOP250數(shù)據(jù)

    python爬取豆瓣電影TOP250數(shù)據(jù)

    這次以豆瓣電影TOP250網(wǎng)為例編寫(xiě)一個(gè)爬蟲(chóng)程序,并將爬取到的數(shù)據(jù)(排名、電影名和電影海報(bào)網(wǎng)址)存入MySQL數(shù)據(jù)庫(kù)中。
    2021-05-05
  • Python庫(kù)AutoTS一行代碼得到最強(qiáng)時(shí)序基線(xiàn)

    Python庫(kù)AutoTS一行代碼得到最強(qiáng)時(shí)序基線(xiàn)

    AutoTS它是一個(gè)用于自動(dòng)時(shí)間序列分析的 Python 庫(kù)。AutoTS 允許我們用一行代碼訓(xùn)練多個(gè)時(shí)間序列模型,以便我們可以選擇最適合的模型,今天介紹一種非常霸道的工具,融合了自動(dòng)化機(jī)器學(xué)習(xí)技術(shù)開(kāi)發(fā)的AutoTS
    2022-03-03
  • Python運(yùn)行的17個(gè)時(shí)新手常見(jiàn)錯(cuò)誤小結(jié)

    Python運(yùn)行的17個(gè)時(shí)新手常見(jiàn)錯(cuò)誤小結(jié)

    當(dāng)初學(xué) Python 時(shí),想要弄懂 Python 的錯(cuò)誤信息的含義可能有點(diǎn)復(fù)雜。這里列出了常見(jiàn)的的一些讓你程序 crash 的運(yùn)行時(shí)錯(cuò)誤
    2012-08-08
  • 詳解centos7+django+python3+mysql+阿里云部署項(xiàng)目全流程

    詳解centos7+django+python3+mysql+阿里云部署項(xiàng)目全流程

    這篇文章主要介紹了詳解centos7+django+python3+mysql+阿里云部署項(xiàng)目全流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Python?pytorch實(shí)現(xiàn)繪制一維熱力圖

    Python?pytorch實(shí)現(xiàn)繪制一維熱力圖

    熱力圖是非常特殊的一種圖,可以顯示不可點(diǎn)擊區(qū)域發(fā)生的事情,這篇文章主要為大家介紹了如何利用pytorch實(shí)現(xiàn)繪制一維熱力圖,感興趣的可以了解一下
    2023-05-05
  • PyQt5之基礎(chǔ)框架解讀

    PyQt5之基礎(chǔ)框架解讀

    這篇文章主要介紹了PyQt5之基礎(chǔ)框架,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python中canmatrix解析dbc文件應(yīng)用常見(jiàn)示例

    Python中canmatrix解析dbc文件應(yīng)用常見(jiàn)示例

    DBC是一種用于描述CAN網(wǎng)絡(luò)協(xié)議的文件格式,Python作為一種流行的編程語(yǔ)言,也提供了解析DBC文件的相關(guān)類(lèi)庫(kù),這篇文章主要給大家介紹了關(guān)于Python中canmatrix解析dbc文件的相關(guān)資料,需要的朋友可以參考下
    2024-08-08

最新評(píng)論