首頁 > 後端開發 > Python教學 > 關於python裝飾器的詳細介紹

關於python裝飾器的詳細介紹

王林
發布: 2020-07-08 13:40:09
原創
2789 人瀏覽過

python裝飾器就是用來拓展原來函數功能的一種函數,目的是在不改變原函數名稱(或類別名稱)的情況下,為函數增加新的功能。裝飾器本質上就是一個閉包,閉包是裝飾器的核心。

關於python裝飾器的詳細介紹

定義

(推薦教學:python教學

python裝飾器(fuctional decorators )就是用來拓展原來函數功能的一種函數,目的是在不改變原函數名(或類別名稱)的情況下,為函數增加新的功能。

這個函數的特殊之處在於它的回傳值也是一個函數,這個函數是內嵌「原「」函數的函數。

詳解

裝飾器其實就是一個閉包,把一個函數當做參數後返回一個替代版函數,閉包是裝飾器的核心。

#簡單解釋下閉包的特點:

一個函數返回的函數對象,這個函數對象執行的話依賴非函數內部的變數值,這個時候,函數返回的實際內容如下:

1、函數對象;

2、函數對象需要使用的外部變數與變數值;

以上就是閉包,閉包必須嵌套在一個函數裡,必須傳回一個呼叫外部變數的函數對象,才是閉包。

舉例:

#encoding=utf-8
import time
def now():
    print "current time is %s" %time.strftime("%Y-%m-%d %H-%M-%S")
res=now
res()
登入後複製

結果:

關於python裝飾器的詳細介紹

現在如果我們想為now()函數增加一些別的功能,例如在呼叫函數前後自動列印一些日誌,但又不希望修改原now()的定義,這時候我們的裝飾器就配上用場了。

本質上,decorator就是一個返回函數的高階函數。所以我們需要定義一個能列印日誌的的decorator

Python2.4以後,支援使用標識符@將裝飾器應用到函數上,只需要在函數的定義前加上@和裝飾器的名稱即可

程式碼:

#encoding=utf-8
import time
#定义装饰器
def log(func):
    def wrapper(*args,**kw):
        print "call func is %s" %func.__name__
        return func(*args,**kw)
    return wrapper

@log
def now():
    now = time.strftime("%Y-%m-%d %H-%M-%S")
    print "current time is %s" %now

now()
登入後複製

結果:

關於python裝飾器的詳細介紹

以上是關於python裝飾器的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板