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