Python进阶|装饰器的那些事(二)

作者: 罗罗攀 | 来源:发表于2019-11-04 08:36 被阅读0次
    前言

    上次我们讲解了装饰器的定义和使用,这节课我们再继续深入聊聊装饰器的那些事。

    装饰器的嵌套

    装饰器是可以嵌套的,当然我们关心的是嵌套的装饰器的执行顺序,例如下面这个案例:

    @decorator1
    @decorator2
    @decorator3
    def func():
        pass
    

    逆向传参,正向执行,所以是这样的:

    decorator1(decorator2(decorator3(func)))
    

    我们还是简单举个例子,加深我们的理解。

    def decorator1(func):
        def wrapper(*args,**kwargs):
            print('first start')
            func(*args,**kwargs)
            print('first end')
        return wrapper
    
    def decorator2(func):
        def wrapper(*args,**kwargs):
            print('second start')
            func(*args,**kwargs)
            print('second end')
        return wrapper
    
    @decorator1
    @decorator2
    def func(message):
        print(message)
    
    func('hello world')
    
    # first start
    # second start
    # hello world
    # second end
    # first end
    
    类装饰器

    之前我们的案例都是用函数作为装饰器,类也是可以做为装饰器的,这个主要是需要用到__call__。

    每当类实例一次,__call__方法就调用一次。

    class Decorate():
        def __init__(self,func):
            self.func = func
    
        def __call__(self, *args, **kwargs):
            print('start')
            return self.func(*args, **kwargs)
    
    @Decorate
    def func(message):
        print(message)
    
    func('hello world')
    # start
    # hello world
    
    案例

    我们经常会去测试一些函数的执行时间,以便进行调试,这时我们就可以使用装饰器来实现这样的功能。

    用以下代码,当想测试其他函数时,只需要在前面加上@log_time即可。

    import time
    def log_time(func):
        def wrapper(*args,**kwargs):
            t1 = time.time()
            func(*args,**kwargs)
            t2 = time.time()
            print('{}'.format(t1-t2))
    
        return wrapper
    
    @log_time
    def func(*args,**kwargs):
        ...
    
    总结

    本次我们讲解了嵌套装饰器以及类装饰器的使用,最后用一个简单的案例,加深你对于装饰器的理解。

    相关文章

      网友评论

        本文标题:Python进阶|装饰器的那些事(二)

        本文链接:https://www.haomeiwen.com/subject/qqvepctx.html