閉包
閉包含義
在函數嵌套的前提下,内部函數使用外部函數的變量,并且外部函數傳回内部函數,我們把這個使用外部函數變量的内部函數叫做閉包
閉包構成
- 在函數嵌套的情況下
- 内部函數使用外部函數的變量
-
外部函數傳回内部函數
代碼實作
初始 閉包和裝飾器
閉包的作用
- 閉包可以儲存外部函數内的變量,不會随着外部函數調用完而銷毀
-
閉包可以提高代碼的可重用
閉包修改外部變量
初始 閉包和裝飾器 注意!!!
修改閉包内使用的外部變量使用nonlocal關鍵字來完成!!!
裝飾器
裝飾器定義
給已有函數增加額外的函數,他的本質就是一個閉包函數
裝飾器的外部功能
1、不修改已有函數的源代碼
2、不修改已有函數的調用方式
3、給已有函數增加額外的功能
裝飾器代碼實作
裝飾器用法一:
裝飾器用法二:文法糖
其中@outter等價于comment = outter(comment)
總結
- 裝飾器本質上就是一個閉包函數,它可以對已有函數進行額外的功能擴充。
- 裝飾器的文法糖用法: @裝飾器名稱,同樣可以完成對已有函數的裝飾操作。
裝飾器使用
使用場所:
- 函數執行時間的統計
- 日志資訊 總結
初始 閉包和裝飾器 - 裝飾器:是在不改變已有函數源代碼及調用方式的前提下,對已有函數進行功能的擴充。
裝飾帶有參數的函數
- 我們通常使用*args和**kwargs進行接收參數
- *args 接收位置傳參
- **kwargs 接受關鍵詞傳參
多個裝飾器使用
代碼實作
通過以上代碼可以看出:多個裝飾器可以對函數進行多個功能的裝飾,裝飾順序是由内到外的進行裝飾
類裝飾器
代碼說明:
- @Check 等價于 comment = Check(comment), 是以需要提供一個init方法,并多增加一個fn參數。
- 要想類的執行個體對象能夠像函數一樣調用,需要在類裡面使用call方法,把類的執行個體變成可調用對象(callable),也就是說可以像調用函數一樣進行調用。
- 在call方法裡進行對fn函數的裝飾,可以添加額外的功能。
總結
- 想要讓類的執行個體對象能夠像函數一樣進行調用,需要在類裡面使用call方法,把類的執行個體變成可調用對象
- 類裝飾器裝飾函數功能在call方法裡面進行添加