欢迎访问宙启技术站
智能推送

Python中的装饰器概念及常见应用场景

发布时间:2023-06-24 15:00:55

Python中的装饰器是可调用对象,它可以在不改变原函数的情况下,对函数进行额外的操作。通过装饰器,我们可以在不改变原函数的情况下,给函数添加新的功能,使得原函数变得更加强大和灵活。在Python中,装饰器是一种特殊的语法,它允许我们用似乎不相关的代码来包装函数。

Python中的装饰器有很多应用场景,下面让我们来看一下常见的应用场景。

1. 计时器

在Python中,我们可以通过装饰器来实现一个计时器,用来计算函数的执行时间。例如,我们可以定义一个计时器装饰器,在函数执行前记录下当前时间,函数执行完后再记录下时间,然后输出执行时间即可。

代码如下:


import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"执行时间:{end_time - start_time}")
        return result
    return wrapper

@timer
def func():
    time.sleep(1)

if __name__ == '__main__':
    func()
    

2. 日志记录器

在开发中,我们经常需要对函数执行过程中产生的异常进行记录,这个时候我们可以通过装饰器来实现一个日志记录器,记录函数执行过程中抛出的异常和其他信息。例如,我们可以定义一个日志记录器装饰器,在函数执行过程中输出日志信息即可。

代码如下:


def logger(func):
    import logging
    logging.basicConfig(filename='log.txt', level=logging.INFO)

    def wrapper(*args, **kwargs):
        try:
            result = func(*args, **kwargs)
            logging.info(f"{func.__name__}: {result}")
            return result
        except Exception as e:
            logging.exception(f"{func.__name__}: {e}")

    return wrapper

@logger
def func():
    raise Exception('Error Occurred')

if __name__ == '__main__':
    func()

3. 缓存

在一些函数执行时,可能需要花费较长的时间进行计算,如果每次都进行计算,效率较低,这个时候我们可以通过装饰器实现一个缓存,记录函数的执行结果,下次执行函数时,如果参数相同,直接返回缓存中的结果。例如,我们可以定义一个缓存装饰器,在函数执行时,先检查是否存在缓存,如果存在直接返回缓存中的结果,否则执行函数并将结果保存到缓存中。

代码如下:


def cache(func):
    cache_dict = {}

    def wrapper(*args, **kwargs):
        key = str(args) + str(kwargs)
        if key in cache_dict:
            return cache_dict[key]
        else:
            result = func(*args, **kwargs)
            cache_dict[key] = result
            return result

    return wrapper

@cache
def fib(n):
    if n <= 1:
        return n
    else:
        return fib(n-1) + fib(n-2)

if __name__ == '__main__':
    print(fib(40))
    print(fib(40))

4. 权限验证

在一些需要权限验证的应用中,可能需要对一些函数进行权限验证,例如,只有管理员才有权修改某些数据,这个时候我们可以通过装饰器来实现权限验证,检查当前登录用户是否有权限执行该函数。例如,我们可以定义一个权限验证装饰器,在函数执行时先检查用户是否有权限执行该函数,如果有则执行,否则抛出异常提示没有权限。

代码如下:


def authenticated(func):
    def wrapper(request, *args, **kwargs):
        if request.user.is_authenticated:
            return func(request, *args, **kwargs)
        else:
            raise Exception('Permission Denied')

    return wrapper

@authenticated
def add_item(request, item_name):
    # 添加商品操作
    pass

总结

Python中的装饰器是一个非常强大的功能,在开发中经常用到,常见应用场景如计时器、日志记录器、缓存、权限验证等。通过装饰器,我们可以在不改变原函数的情况下对函数进行增强,使得函数变得更加强大和灵活。