天天看點

初始 閉包和裝飾器

閉包

閉包含義

在函數嵌套的前提下,内部函數使用外部函數的變量,并且外部函數傳回内部函數,我們把這個使用外部函數變量的内部函數叫做閉包

閉包構成

  • 在函數嵌套的情況下
  • 内部函數使用外部函數的變量
  • 外部函數傳回内部函數

    代碼實作

    初始 閉包和裝飾器

閉包的作用

  • 閉包可以儲存外部函數内的變量,不會随着外部函數調用完而銷毀
  • 閉包可以提高代碼的可重用

    閉包修改外部變量

    初始 閉包和裝飾器

    注意!!!

    修改閉包内使用的外部變量使用nonlocal關鍵字來完成!!!

裝飾器

裝飾器定義

給已有函數增加額外的函數,他的本質就是一個閉包函數

裝飾器的外部功能

1、不修改已有函數的源代碼

2、不修改已有函數的調用方式

3、給已有函數增加額外的功能

裝飾器代碼實作

裝飾器用法一:

初始 閉包和裝飾器

裝飾器用法二:文法糖

初始 閉包和裝飾器

其中@outter等價于comment = outter(comment)

總結

  • 裝飾器本質上就是一個閉包函數,它可以對已有函數進行額外的功能擴充。
  • 裝飾器的文法糖用法: @裝飾器名稱,同樣可以完成對已有函數的裝飾操作。

裝飾器使用

使用場所:

  • 函數執行時間的統計
  • 日志資訊
    初始 閉包和裝飾器
    總結
  • 裝飾器:是在不改變已有函數源代碼及調用方式的前提下,對已有函數進行功能的擴充。

裝飾帶有參數的函數

初始 閉包和裝飾器
  • 我們通常使用*args和**kwargs進行接收參數
  • *args 接收位置傳參
  • **kwargs 接受關鍵詞傳參

多個裝飾器使用

代碼實作

初始 閉包和裝飾器

通過以上代碼可以看出:多個裝飾器可以對函數進行多個功能的裝飾,裝飾順序是由内到外的進行裝飾

類裝飾器

初始 閉包和裝飾器

代碼說明:

  • @Check 等價于 comment = Check(comment), 是以需要提供一個init方法,并多增加一個fn參數。
  • 要想類的執行個體對象能夠像函數一樣調用,需要在類裡面使用call方法,把類的執行個體變成可調用對象(callable),也就是說可以像調用函數一樣進行調用。
  • 在call方法裡進行對fn函數的裝飾,可以添加額外的功能。

總結

  1. 想要讓類的執行個體對象能夠像函數一樣進行調用,需要在類裡面使用call方法,把類的執行個體變成可調用對象
  2. 類裝飾器裝飾函數功能在call方法裡面進行添加