裝飾器詳解(python)

2021-08-04 10:36:25 字數 1354 閱讀 5674

本文將介紹裝飾器的內容,並舉例說明。

裝飾器在python中實際上就是乙個函式,這個函式可以在不改變原(其他)函式**和呼叫方式的條件下為原函式新增功能。裝飾器(函式)在結尾返回乙個函式物件。常常用於插入日誌、效能測試、事務處理、快取、許可權校驗等場景。

編寫裝飾器函式的原則是:

1. 不能修改原函式(被裝飾的函式)的源**。

2. 不能修改原函式的呼叫方式。

下面我們從原函式開始,以逐漸滿足兩個原則的步驟得到裝飾器**。

首先定義原函式

__author__ = "allen liu"

__time__ = "2017/8/1"

'''this program is an example of decorator '''

import time

def func1():

print('start the function fun1...')

time.sleep(1)

print('the function fun1 is end!')

那麼我們想為函式新增乙個計時的功能,想要達到的效果就是可以得到函式執行花費的時間,例如輸出『the time of fun1 cost is **』。

def deco(fun):

start_time = time.time()

fun()

end_time = time.time()

run_time = end_time - start_time

print('the running time is %f' % run_time)

deco(func1)

這種方法滿足裝飾器的第乙個原則:不改變源**。但是改變了原函式的呼叫方式,(原函式的呼叫方式為func1())。

下面我們通過函式巢狀的方式,對上面的deco函式做出修改,使其滿足第二條原則:

def deco(fun):

start_time = time.time()

fun()

end_time = time.time()

run_time = end_time - start_time

print('the running time is %f' % run_time)

func1 = deco(func1)

func1()

下面介紹裝飾器語法糖:

在python中,可以使用」@」語法糖來精簡裝飾器的**,此時只需要在func1函式定義前新增**@deco

這句**等價於:func1 = deco(func1)。然後就可以直接通過func1()進行呼叫。

python裝飾器 python 裝飾器詳解

def outer x def inner y return x y return inner print outer 6 5 11 如 所示,在outer函式內,又定義了乙個inner函式,並且inner函式又引用了外部函式outer的變數x,這就是乙個閉包了。在輸出時,outer 6 5 第乙個...

python裝飾器詳解 python裝飾器詳解

按照 python 的程式設計原則,當乙個函式被定義後,如要修改或擴充套件其功能應盡量避免直接修改函式定義的 段,否則該函式在其他地方被呼叫時將無法正常執行。因此,當需要修改或擴充套件已被定義的函式的功能而不希望直接修改其 時,可以使用裝飾器。先來看乙個簡單的例子 def func1 functio...

詳解Python裝飾器

裝飾器的難點 在梳理了裝飾器的整個內容之後,我認為難點不是裝飾器本身,而是直接呼叫被裝飾的函式,讓人無法理解背後究竟發生了什麼。一 引出裝飾器概念 引入問題 定義了乙個函式,想在執行時動態的增加功能,又不想改動函式本身的 示例 希望對下列函式呼叫增加log功能,列印出函式呼叫 def f1 x re...