我們先看乙個閉包的例子:
from time importctime
defbefore_call(f):
'before calling, now is %s
' %ctime()
return f(*args, **kargs)
return
deftest(name):
'hello, %s
' %(name)
if__name__ == '
__main__':
before_call(test)(
"lucky
")
我們先看執行結果:
~/documents/py python 2.pybefore calling, now
is sat dec 27 21:30:18 2014hello, lucky
from time importctime
defbefore_call(f):
'before calling, now is %s
' %ctime()
return f(*args, **kargs)
return
defafter_call(f):
try:
return f(*args, **kargs)
finally
:
'after calling, now is %s
' %ctime()
return
deftest(name):
'hello, %s
' %(name)
if__name__ == '
__main__':
before_call(test)(
"lucky")
after_call(test)(
"peter")
before_call(after_call(test))(
"john")
after_call(before_call(test))(
'marry
')
執行結果為:
~/documents/py python 2.pybefore calling, now
is sat dec 27 21:37:24 2014hello, lucky
hello, peter
after calling, now
is sat dec 27 21:37:24 2014before calling, now
is sat dec 27 21:37:24 2014hello, john
after calling, now
is sat dec 27 21:37:24 2014before calling, now
is sat dec 27 21:37:24 2014hello, marry
after calling, now
is sat dec 27 21:37:24 2014
執行結果是正確的。注意最後兩個,順序交換了,對結果無影響。
下面我們再包裝一層:
defafter_call():
defafter(f):
try:
return f(*args, **kargs)
finally
:
'after calling, now is %s
' %ctime()
return
return
after
defbefore_call():
defbefore(f):
'before calling, now is %s
' %ctime()
return f(*args, **kargs)
return
return before
那麼如何使用呢?這裡就是python裝飾器的語法,
如果我們這樣使用:
@before_call()deftest(name):
'hello, %s
' %(name)
if__name__ == '
__main__':
test(
"lucky
")
注意test函式前加了裝飾的符號。
還可以這樣:
@after_call()deftest(name):
'hello, %s
' % (name)
甚至可以巢狀多層:
@before_call()@after_call()
deftest(name):
'hello, %s
' % (name)
這就是python中裝飾器的原理,內部採用了閉包。
Python高階 閉包與裝飾器
前言 在python中,閉包是一種非常有用的功能!它通常與裝飾器一起搭配使用,可以在不改變被裝飾函式的功能的基礎上,完成更多的功能。如許可權認證。一 如何定義閉包 1.閉包就是兩個巢狀的函式,外層函式返回內層函式的引用,而且外層函式必須攜帶引數!為什麼外層函式必須要有引數呢?可以思考一下!基本格式如...
Python高階 閉包與裝飾器
1.函式引數 1 函式名存放的是函式的位址 2 函式名 存放的是函式內的 3 函式名只是函式 空間的引用,當函式名賦值給乙個物件的時候,就是引用傳遞 def func01 print func01 is show test func01 print func01 print test test 2....
python 閉包 注入 裝飾
coding utf 8 defhtml tags tag name print print call html tags tag name tag name def func print tcall warpper func func.name str type func def args,kwa...