標籤:筆記 問題 傳回值 定義 入參 python裝飾器 int func 不同的
什麼函數可以被稱為閉包函數呢?主要是滿足兩點:函數內部定義的函數;引用了外部變數但非全域變數。
python裝飾器本質上就是一個函數,它可以讓其他函數在不需要做任何代碼變動的前提下增加額外的功能,裝飾器的傳回值也是一個函數對象(函數的指標)
裝飾器函數的外部函數傳入我要裝飾的函數名字,返回經過修飾後函數的名字;內層函數(閉包)負責修飾被修飾函數。從上面這段描述中我們需要記住裝飾器的幾點屬性,以便後面能更好的理解:
實質: 是一個函數
參數:是你要裝飾的函數名(並非函數調用)
返回:是裝飾完的函數名(也非函數調用)
作用:為已經存在的對象添加額外的功能
特點:不需要對對象做任何的代碼上的變動
python裝飾器有很多經典的應用情境,比如:插入日誌、效能測試、交易處理、許可權校正等。裝飾器是解決這類問題的絕佳設計。並且從引入中的列子中我們也可以歸納出:裝飾器最大的作用就是對於我們已經寫好的程式,我們可以抽離出一些雷同的程式碼群組建多個特定功能的裝飾器,這樣我們就可以針對不同的需求去使用特定的裝飾器,這時因為源碼去除了大量泛化的內容而使得源碼具有更加清晰的邏輯。
函數裝飾器
以為函數添加計時功能為例,講述函數裝飾器。
import timedef decorator(func): def wrapper(*args, **kwargs): start_time = time.time() func() end_time = time.time() print(end_time - start_time) return wrapper@decorator def func(): time.sleep(0.8)func() # 函數調用
# 輸出:0.800644397735595
在上面代碼中 func是我要裝飾器的函數,我想用裝飾器顯示func函數啟動並執行時間。@decorator這個文法相當於 執行 func = decorator(func),為func函數裝飾並返回。在來看一下我們的裝飾器函數 - decorator,該函數的傳入參數是func (被裝飾函數),返回參數是內層函數。這裡的內層函數-wrapper,其實就相當於閉包函數,它起到裝飾給定函數的作用,wrapper參數為*args, **kwargs。*args表示的參數以列表的形式傳入;**kwargs表示的參數以字典的形式傳入:
凡是以key=value形式的參數均存在kwargs中,剩下的所有參數都以列表的形式存於args中。這裡要注意的是:為了不破壞原函數的邏輯,我們要保證內層函數wrapper和被裝飾函數func的傳入參數和傳回值類型必須保持一致。
Python實用筆記 (15)函數式編程——裝飾器