装饰器(四)-多装饰器

2019-12-25  本文已影响0人  mysimplebook

多个装饰器可以共同修饰一个函数,多装饰器的执行顺序从近到远或者说由下而上。其格式如下

@outer2

@outer1

def foo(*args, **kwargs):

                    pass

上述写法相当于

@outer2

def outer1(foo):

   pass

而decrator_b(foo)返回的就是一个可调用对象,多个装饰器也可以看成只有最外层的一个。这样函数foo经过装饰器装饰后,实际上等价于

foo= outer2 (outer1(foo))

如下代码

import time

def outer1(func):

    #定义一个内嵌的包装函数,给传入的函数加上计时功能的包装

    print("in outer1")

    def inner1(*args, **kwargs):

        '''inner decorator'''

        print("ininner1")

        start = time.clock()

        ret = func(*args, **kwargs)

        end = time.clock()

        print('used:', end - start)

        return ret

    #将包装后的函数返回

    return inner1

 

def outer2(func):

    #定义一个内嵌的包装函数,给传入的函数加上计时功能的包装

    print("in outer2")

    def inner2(*args, **kwargs):

        '''inner decorator'''

        print("ininner2")

        ret = func(*args, **kwargs)

        return ret

    #将包装后的函数返回

    return inner2

       当用outer1、outer2修饰下面这个函数的时候,

>>> @outer2

... @outer1

... def foo(*args, **kwargs):

...     '''docstring'''

...     print("in foo()")

...     return "hello"+args[0]

...

in outer1

in outer2

>>> 

>>> foo('world')

in inner2

in inner1

in foo()

('used:', 0.0)

'hello world'

>>> 

它其实等价于下列代码

>>> def foo(*args, **kwargs):

...     '''docstring'''

...     print("in foo()")

...     return "hello"+args[0]

...

>>> foo=outer2(outer1(foo))

in outer1

in outer2

>>> foo('world')

in inner2

in inner1

in foo()

('used:', 0.0)

'hello world'

>>> 

上一篇 下一篇

猜你喜欢

热点阅读