Python閉包的高階應用 裝飾器的實現

2022-05-23 04:21:09 字數 2687 閱讀 9404

我們先看乙個閉包的例子:

from time import

ctime

defbefore_call(f):

print

'before calling, now is %s

' %ctime()

return f(*args, **kargs)

return

deftest(name):

print

'hello, %s

' %(name)

if__name__ == '

__main__':

before_call(test)(

"lucky

")

我們先看執行結果:

~/documents/py python 2.py 

before calling, now

is sat dec 27 21:30:18 2014hello, lucky

from time import

ctime

defbefore_call(f):

print

'before calling, now is %s

' %ctime()

return f(*args, **kargs)

return

defafter_call(f):

try:

return f(*args, **kargs)

finally

:

print

'after calling, now is %s

' %ctime()

return

deftest(name):

print

'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.py 

before 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

執行結果是正確的。注意最後兩個,順序交換了,對結果無影響。

下面我們再包裝一層:

def

after_call():

defafter(f):

try:

return f(*args, **kargs)

finally

:

print

'after calling, now is %s

' %ctime()

return

return

after

defbefore_call():

defbefore(f):

print

'before calling, now is %s

' %ctime()

return f(*args, **kargs)

return

return before

那麼如何使用呢?這裡就是python裝飾器的語法,

如果我們這樣使用:

@before_call()

deftest(name):

print

'hello, %s

' %(name)

if__name__ == '

__main__':

test(

"lucky

")

注意test函式前加了裝飾的符號。

還可以這樣:

@after_call()

deftest(name):

print

'hello, %s

' % (name)

甚至可以巢狀多層:

@before_call()

@after_call()

deftest(name):

print

'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...