玩蛇网提供最新Python编程技术信息以及Python资源下载!

一种从没见过的python装饰器求指导

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


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

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

我觉得装饰器可以看做是闭包的一种特殊形式

@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

只要你能够理解下列代码:

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

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

完全一样,一切问题就可以用很容易的方式来解释了。


为什么会有个 wrapper 函数来将代码包一层?

这是为了接收 now 函数的参数。

既然 now = log(now) 那就要求 log 的返回值必须是个函数。当你调用 now(*args) 的时候就必须要保证 log 返回的函数能够接收到 *args 参数。这下你明白了吧。

装饰器函数的第一层用于接收被装饰函数的函数本身,第二层用于接收调用被装饰函数时,传递的参数。关于这个,我写过一篇blog
http://coolbit.in/blog/2014/03/29/decorator-exception-handling/

玩蛇网文章,转载请注明出处和文章网址:https://www.iplaypy.com/wenda/wd19382.html

相关文章 Recommend

玩蛇网Python互助QQ群,欢迎加入-->: 106381465 玩蛇网Python新手群
修订日期:2017年05月24日 - 19时42分57秒 发布自玩蛇网

您现在的位置: 玩蛇网首页 > Python问题解答 > 正文内容
我要分享到:

必知PYTHON教程 Must Know PYTHON Tutorials

必知PYTHON模块 Must Know PYTHON Modules