本文**借用 廖雪峰的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 ...