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

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


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

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

学习是最好的投资!

reply all (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
        Latest Downloads
        More>
        Web Effects
        Website Source Code
        Website Materials
        Front End Template
        About us Disclaimer Sitemap
        php.cn:Public welfare online PHP training,Help PHP learners grow quickly!