裝飾器 函式呼叫 語句分析法

2022-09-03 06:45:11 字數 946 閱讀 5212

假設我們要增強now()函式的功能,比如,在函式呼叫前後自動列印日誌,但又不希望修改now()函式的定義,這種在**執行期間動態增加功能的方式,稱之為「裝飾器」(decorator)。

本質上,decorator就是乙個返回函式的高階函式。所以,我們要定義乙個能列印日誌的decorator,可以定義如下:

def log(func):

print 'call %s():' % func.__name__

return func(*args, **kw)

觀察上面的log,因為它是乙個decorator,所以接受乙個函式作為引數,並返回乙個函式。我們要借助python的 @語法,把decorator置於函式的定義處:

@log

def now():

print '2013-12-25'

呼叫now()函式,不僅會執行now()函式本身,還會在執行now()函式前列印一行日誌:

>>> now()

call now():

2013-12-25

把 @log放到now()函式的定義處,相當於執行了語句:

now = log(now)
從上分析,可以看出函式都是在呼叫中分析,所以就不斷找函式、函式呼叫、引數、以及return語句。不斷以return返回的函式來從後向前推。

所以通用的分析語句的方法是:

把 @log放到now()函式的定義處,相當於執行了語句:now = log(now)

即首先執行log(now).

呼叫返回的函式,引數是(),即none。

返回值最終是原始函式now

python裝飾器分析 Python裝飾器舉例分析

概述 裝飾器本質上是乙個python函式,它可以讓其他函式在不需要做任何 變動的前提下增加額外功能,裝飾器的返回值也是乙個函式物件。我們要需要乙個能測試函式執行時間的decorator,可以定義如下 def timer func start time time.time res func args,...

函式裝飾器 類裝飾器

一 函式裝飾函式 defwrapfun func definner a,b print function name func.name r func a,b return r return inner wrapfun defmyadd a,b return a b print myadd 2,3 二...

python裝飾器 函式裝飾器,類裝飾器

只要實現此 模式,這個obj就叫乙個裝飾器 參考 函式裝飾器 例子 def decorator func def inner args,kwargs print before.res func args,kwargs print after.return res return inner decor...