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

Python进阶|装饰器的那些事(二)_第1张图片
前言

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

装饰器的嵌套

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

@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进阶|装饰器的那些事(二))