閉包函式與裝飾器

2022-08-02 06:00:17 字數 1277 閱讀 9492

一、閉包函式

定義在函式內部的函式,並且該函式包含對外部函式作用域中名字的引用,該函式就稱為閉包函式。

乙個持有外部環境變數的函式就是閉包,閉包=函式塊+定義函式時的環境。

閉包函式是乙個能記住巢狀作用域變數值的函式,儘管作用域已經不存在

工廠函式定義了乙個外部的函式,這個函式簡單的生成並返回乙個內嵌的函式,僅僅是返回卻不呼叫,因此通過呼叫這個工廠函式,可以得到內嵌函式的乙個引用,內嵌函式就是通過呼叫工廠函式時,執行內部的def語句而建立的。

閉包的作用:

1、當閉包執行完後,仍然能夠保持住當前的執行環境。希望函式的每次執行結果,都是基於這個函式上次的執行結果。

2、閉包可以根據外部作用域的區域性變數來得到不同的結果。這有點像一種類似配置功能的作用,可以修改外部的變數,閉包根據這個變數展現出不同的功能。比如有時需要對某些檔案的特殊行進行分析,先要提取出這些特殊行。

閉包中是不能修改外部作用域的區域性變數的,作用域關係在函式定義階段就規定死了,與呼叫位置無關。

二、裝飾器

裝飾器其實就是乙個閉包函式,乙個用來包裝函式的函式,返回乙個修改之後的函式物件,將其重新賦值原來的識別符號,並永久喪失對原始函式物件的訪問。

裝飾器與被裝飾物件均是可以任意可呼叫的物件,可以是函式

裝飾器的作用:

在不修改被裝飾物件源**與呼叫方式前提下,為被裝飾物件新增新功能

一般情況下,裝飾器主要可以用在快取、日誌、url路由和許可權校驗等常見的功能上

1)、快取:假設有乙個函式的執行時間比較長,為了節省時間,我們可以對其結果進行快取

2)、單例模式的優雅實現

3)、執行緒裝飾器實現簡單非同步:將被裝飾的函式進行非同步處理,耗時的操作將在新執行緒中執行,web服務可以直接返回響應,無需等待

4)、失敗重試機制:利用裝飾器,對某些函式增加重試功能

裝飾器基本形式模板:

語法糖:@放在被裝飾物件的正上方

疊加多個裝飾器:@@

被裝飾物件

當有多個裝飾器時,裝飾順序按靠近被裝飾物件順序執行。呼叫時由外而內,執行順序和裝飾順序相反

在裝飾器中,被裝飾函式的元屬性變成了裝飾函式(裝飾器最終返回的那個函式)的資訊,為了消除這種***,可以使用functools模組的wraps方法,對裝飾器最終返回的那個函式進行裝飾

模板:from functools import wraps

閉包函式與裝飾器

八.閉包函式 定義在函式內部的函式,並且該函式包含對外部函式作用中名字的引用,該函式就稱為閉包函式 閉 指的是定義在函式內部的函式 作用域關係 在函式定義階段就規定死了,與呼叫位置無關 def outter x 2def inner x 1 print from inner x return inn...

閉包函式與裝飾器

目錄 三 三層裝飾器 閉是封閉 函式內部的函式 包是包含 該內部函式對外部作用域而非全域性作用域的變數的引用 閉包就是指 函式內部的函式 對外部作用域 而非全域性作用域 的引用。閉包函式的作用 可以把 閉包函式內部的變數 閉包函式內部的函式 這兩者包裹在一起,然後通過返回值的形式返回出來。閉包函式的...

裝飾器與閉包

閉包 內層函式呼叫外層函式的引數,並且返回內層函式,叫做閉包。裝飾器 是裝飾器的符號 裝飾器是對閉包的一種利用,內層函式呼叫外層函式的引數,並且返回內層函式,叫做閉包,把呼叫的引數,換成函式,就是裝飾器,因為python中,函式也是當做物件,從而有裝飾器這一種特殊的用法。有引數的裝飾器就是在外面一層...