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

Python装饰器的分类与应用实例

发布时间:2023-08-17 14:01:15

Python装饰器是一种函数,它可以在不修改原有函数代码的情况下,为函数添加额外的功能。装饰器可以应用于各种场景,以提高代码的可维护性和可扩展性。根据应用的场景和实现方式,Python装饰器可以分为以下几类。

1. 函数装饰器:函数装饰器是最常见的一种装饰器,它是一个函数,接受一个函数作为参数,并返回一个新的函数作为修饰后的函数。函数装饰器可以在被修饰的函数执行前后执行额外的代码,比如记录日志、计时等。下面是一个简单的函数装饰器的例子:

def logger(func):
    def wrapper(*args, **kwargs):
        print(f'Calling function: {func.__name__}')
        return func(*args, **kwargs)
    return wrapper

@logger
def add(a, b):
    return a + b

result = add(1, 2)
print(result)  # Output: Calling function: add
               #         3

2. 类装饰器:类装饰器是一个类,它接受一个函数或方法作为参数,并返回一个新的函数或方法作为修饰后的函数或方法。类装饰器与函数装饰器类似,但它的使用方式更加灵活,可以在多个方法上添加额外的功能。下面是一个简单的类装饰器的例子:

class Logger:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print(f'Calling function: {self.func.__name__}')
        return self.func(*args, **kwargs)

@Logger
def add(a, b):
    return a + b

result = add(1, 2)
print(result)  # Output: Calling function: add
               #         3

3. 带参数的装饰器:装饰器可以接受额外的参数,以灵活地配置装饰器的行为。带参数的装饰器可以通过在装饰器本身外再定义一层函数来实现。下面是一个带参数的装饰器的例子:

def logger(log_level):
    def decorator(func):
        def wrapper(*args, **kwargs):
            if log_level == 'INFO':
                print('[INFO] Calling function: ', func.__name__)
            elif log_level == 'DEBUG':
                print('[DEBUG] Calling function: ', func.__name__)
            else:
                print('[ERROR] Invalid log level')
            return func(*args, **kwargs)
        return wrapper
    return decorator

@logger('INFO')
def add(a, b):
    return a + b

result = add(1, 2)
print(result)  # Output: [INFO] Calling function: add
               #         3

4. 多个装饰器的组合:多个装饰器可以按照顺序组合使用,每个装饰器对函数添加不同的功能。通过将多个装饰器按照从上到下的顺序依次应用到函数上,从而实现多个装饰器功能的叠加。下面是一个多个装饰器的组合的例子:

def logger(func):
    def wrapper(*args, **kwargs):
        print(f'Calling function: {func.__name__}')
        return func(*args, **kwargs)
    return wrapper

def timer(func):
    import time
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f'Total time: {end_time - start_time:.2f}s')
        return result
    return wrapper

@timer
@logger
def add(a, b):
    return a + b

result = add(1, 2)
print(result)  # Output: Calling function: add
               #         Total time: 0.00s
               #         3

以上是一些常见的Python装饰器分类与应用实例。装饰器通过将额外的代码与函数原有的代码分离,使函数更加简洁和可维护,同时也提供了一种可插拔的方式来增强函数的功能,使得代码更加灵活和可扩展。因此,在实际的开发中,合理使用装饰器可以帮助提高代码质量和开发效率。