python - 关于 decorator
PHPz
PHPz 2017-04-17 13:33:34
0
3
320

求详解,第一种多的一层包裹到底是用来干嘛的


这种装饰器很常见,也没问过为什么

>>> def log(func):
...     def wrapper(*args, **kwargs):
...         print "call: ", func.__name__
...         return func(*args, **kwargs)
...     return wrapper
... 
>>> @log
... def now():
...     print "It's now..."
... 
>>> now()
call:  now
It's now...

这种... 我第一次见,求详解

>>> def log(func):
...     print "call: ", func.__name__
...     return func
... 
>>> @log
... def now():
...     print "It's now......"
... 
call:  now
>>> now()
It's now......
PHPz
PHPz

学习是最好的投资!

全部回覆(3)
小葫芦

裝飾器函數的第一層用於接收被裝飾函數的函數本身,第二層用於接收被裝飾函數時,傳遞的參數。關於這個,我寫過一篇blog
http://coolbit.in/blog/2014/03/29/decorator-exception-handling/

大家讲道理

只要你能理解下列程式碼:

@log 
def now():
   print('now')

def now():
   print('now')
now = log(now)

完全一樣,一切問題就可以用很容易的方式來解釋了。


為什麼會有一個 wrapper 函式來將程式碼包一層?

這是為了接收 now 函數的參數。

既然 now = log(now) 那就要求 log 的回傳值必須是個函數。當你呼叫 now(*args) 的時候就必須要保證 log 回傳的函數能夠接收到 *args 參數。這下你明白了吧。

巴扎黑

我覺得裝飾器可以看做是閉包的一種特殊形式

@decorator
def func():
    pass
# 等价于
func = decorator(func)

至少要有閉包才能算真正的裝飾器

>>> def log(func):
...     print 'call:', func.__name__
...     return func
... 
>>> @log
... def now():
...     print 'It is now ...'
... 
call: now
>>> now()
It is now ...
>>> print now.func_closure
None
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!