关于 decorator
求详解,第一种多的一层包裹到底是用来干嘛的
这种装饰器很常见,也没问过为什么
>>> 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......
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
装饰器函数的第一层用于接收被装饰函数的函数本身,第二层用于接收调用被装饰函数时,传递的参数。关于这个,我写过一篇blog
http://coolbit.in/blog/2014/03/29/decorator-exception-handling/
只要你能够理解下列代码:
与
完全一样,一切问题就可以用很容易的方式来解释了。
为什么会有个 wrapper 函数来将代码包一层?
这是为了接收 now 函数的参数。
既然
now = log(now)
那就要求 log 的返回值必须是个函数。当你调用now(*args)
的时候就必须要保证 log 返回的函数能够接收到 *args 参数。这下你明白了吧。我觉得装饰器可以看做是闭包的一种特殊形式
至少要有闭包才能算真正的装饰器