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

python閉包和裝飾器你了解嗎

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

一、閉包

1. 什么是閉包?

在函數中可以(嵌套)定義另一個函數時,如果內部的函數引用了外部的函數的變量,則可能產生 閉包。

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

在給定函數被多次調用的過程中,這些私有變量能夠保持其持久性。

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

必須有一個內嵌函數(函數里定義的函數)——這對應函數之間的嵌套

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

外部函數必須返回內嵌函數——必須返回那個內部函數

換句話說:

其實,閉包的概念很簡單:一個可以引用在函數閉合范圍內變量的函數。即"內部函數",只有那個內部函 數才有所謂的__closure__屬性。

3. 閉包的原理

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

組里面的對象為cell對象,而訪問cell對象的cell_contents屬性則可以得到閉包變量的當前值 (即上一次調用之后的值)。

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

所以可見,一旦形成閉包之后,python確實會將__closure__和閉包函數綁定作為儲存閉包變量的場所

4. 閉包的好處

閉包不是必須的。

沒了閉包,python的功能一點不會被影響

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

二、裝飾器

1. 什么是裝飾器

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

簡單來說Python中的裝飾器就是指某些函數或其他可調用對象,以函數或類作為可選輸入參數, 然后返回函數或類的形式。通過這個在Python2.6版本中被新加入的特性可以用來實現(xiàn)裝飾器設計 模式。

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

函數也是對象,也可以當做參數傳遞

2. 裝飾器有什么用

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

引入日志

增加計時邏輯來檢測性能

給函數加入事務的能力

權限控制

3. 小 練 習

這里有個小練習,可以來試試哈 >-<

用裝飾器實現(xiàn)權限控制

定義一個全局變量:username

定義add函數,實現(xiàn)兩個數相加

實現(xiàn)login_required裝飾器,如果username值為root,提示"歡迎" 并計算結果,否則"沒有權限

代碼如下(示例):

三. 編寫和使用裝飾器

1. 小案例

應用多個裝飾器

2.應用注意事項

應用多個裝飾器

封裝時,至下而上

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

在實際應用的場景中,當我們采用上面的方式寫了兩個裝飾方法比如先驗證有沒有登錄 @login_required , 再驗證權限夠不夠時 @permision_allowed

3.保留元數據-什么是元數據

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

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

4.保留元數據-裝飾器后為什么元數據會丟失

因為return執(zhí)行的,是經過調用封裝后的函數

5.保留元數據

利用**@functools.wraps(fun)**,將一個函數的重要內容復制到另一個函數

溫馨提醒:任何時候你定義裝飾器的時候,都應該使用 functools 庫中的 @wraps 裝飾器來注解底層 包裝函數。

6.小案例

在這里插入圖片描述

7.內置的裝飾器

Python還提供了類裝飾器與**@staticmethod**,@classmethod,@property和這三個在面向對象編 程中常用的裝飾器

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

classmethod:把類中定義的實例方法變成類方法

property:把類中定義的實例方法變成類屬性。

四. 裝飾器的應用

1.為什么使用裝飾器

模塊化且清晰明確

代碼重用

裝飾器是顯式的,增強可讀性

2.在何處使用裝飾器

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

要使用一個類上的方法不需要這個類的實例(@classmethod或@staticmethod)

mock模塊(單元測試python3.3后加入標準庫-@mock.patch或@mock.patch.object)

Django(@login_required, @permission_reqired)

Flask(@app.route) 充當url與函數之間的注冊表

Celery(@task) 返回Task類實例

插入日志、性能測試、事務處理、緩存、權限校驗等場景

記錄結果、增加計時邏輯來檢測性能等

五. 課后作業(yè)

1.實現(xiàn)函數注冊表

在這里插入圖片描述

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

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

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

查看超市物品,不需要登錄 • 購物及查看余額,需要登錄

先驗證用戶是否已經登錄(如果用戶未登錄提示“用戶未登錄,請登錄后重試”,并跳 轉到功能菜單)

總結

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

對于裝飾器部分,要了解它是怎么應用的,在什么時候,什么地方應用,多寫幾個案例就明白了。

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!

相關文章

  • Python cookbook(數據結構與算法)從字典中提取子集的方法示例

    Python cookbook(數據結構與算法)從字典中提取子集的方法示例

    這篇文章主要介紹了Python cookbook(數據結構與算法)從字典中提取子集的方法,涉及Python字典推導式的相關使用技巧,需要的朋友可以參考下
    2018-03-03
  • Django drf請求模塊源碼解析

    Django drf請求模塊源碼解析

    APIView中的dispatch是整個請求生命過程的核心方法,包含了請求模塊,權限驗證,異常模塊和響應模塊,我們先來介紹請求模塊,對Django drf請求模塊源碼相關知識感興趣的朋友一起看看吧
    2021-06-06
  • 常見python正則用法的簡單實例

    常見python正則用法的簡單實例

    下面小編就為大家?guī)硪黄R妏ython正則用法的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • python爬取豆瓣電影TOP250數據

    python爬取豆瓣電影TOP250數據

    這次以豆瓣電影TOP250網為例編寫一個爬蟲程序,并將爬取到的數據(排名、電影名和電影海報網址)存入MySQL數據庫中。
    2021-05-05
  • Python庫AutoTS一行代碼得到最強時序基線

    Python庫AutoTS一行代碼得到最強時序基線

    AutoTS它是一個用于自動時間序列分析的 Python 庫。AutoTS 允許我們用一行代碼訓練多個時間序列模型,以便我們可以選擇最適合的模型,今天介紹一種非常霸道的工具,融合了自動化機器學習技術開發(fā)的AutoTS
    2022-03-03
  • Python運行的17個時新手常見錯誤小結

    Python運行的17個時新手常見錯誤小結

    當初學 Python 時,想要弄懂 Python 的錯誤信息的含義可能有點復雜。這里列出了常見的的一些讓你程序 crash 的運行時錯誤
    2012-08-08
  • 詳解centos7+django+python3+mysql+阿里云部署項目全流程

    詳解centos7+django+python3+mysql+阿里云部署項目全流程

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

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

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

    PyQt5之基礎框架解讀

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

    Python中canmatrix解析dbc文件應用常見示例

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

最新評論