Python實用筆記 (15)函數式編程——裝飾器

來源:互聯網
上載者:User

標籤:筆記   問題   傳回值   定義   入參   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)函數式編程——裝飾器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.