python中裝飾器的執行細節

2021-06-28 12:52:22 字數 1369 閱讀 4552

本文**借用 廖雪峰的python教程(官網:

不了解裝飾器的可以先看教程

直接上帶引數裝飾器的**

def log(text):

def decorator(func):

print '%s %s():' % (text, func.__name__)

return func(*args, **kw)

return decorator

@log('execute')

def now():

print '2013-12-25'

now()

控制台輸出:

execute now():

2013-12-25

這都很好理解,但是我在看到教程中的用flask框架寫web應用時

def home():

return ''

只要在函式前面新增這樣的裝飾器,就能達到自動地把url和函式給關聯起來的目的

可是為什麼這樣寫裝飾器就能有這樣的效果呢

def route(self, rule, **options):

def decorator(f):

endpoint = options.pop('endpoint', none)

self.add_url_rule(rule, endpoint, f, **options)

return f

return decorator

可是,這些對映規則不是應該在我們呼叫home函式前就應該建立起來嗎?不然怎麼自動對映到home這個函式。

會造成這樣的困惑的原因是我一直誤解的裝飾器的裝飾過程,其實裝飾器的裝飾過程是在函式定義的時候就執行了,即你在呼叫home之前,home早就裝飾器碉堡換成裝飾器返回的函式了。也就是說,就算你沒呼叫home函式,裝飾器的**也早就執行了。

我們用**來驗證一下:

def log(text):

print 'print 1'

def decorator(func):

print 'print 2'

print '%s %s():' % (text, func.__name__)

return func(*args, **kw)

return decorator

@log('nihao')

def now():

print '2013-12-25'

控制台輸出:

print 1

print 2

結果顯示:我們還沒呼叫now(),兩個print語句已經執行了。

python中裝飾器

對修改是封閉的,對擴充套件是開放的 import time def f1 print time.time print this is a function.def f2 print this is a function.print time.time f1 def print current tim...

python中裝飾器詳解

最新學了裝飾器,有乙個疑問一直困擾我,思考了幾天,終於明白。首先,展示正常的裝飾器 允許向乙個現有的物件新增新的功能,同時又不改變其結構,就是給函式穿個衣服,但是不改變函式 該如何寫?def log func print call s func.name return func args,kw 依照...

python中裝飾器理解

裝飾器 decorators 是 python 的乙個重要部分。簡單地說 他們是修改其他函式的功能的函式。他們有助於讓我們的 更簡短!由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 ...