Python中的装饰器是一种特殊类型的声明,它允许程序员在不修改原有函数或类代码的基础上,通过在函数定义前添加额外的逻辑来增强或修改其行为。装饰器本质上是一个接收函数作为参数并返回新函数的可调用对象。这个新函数通常会包裹住原有的函数,在其前后执行额外的操作,如日志记录、性能监控、权限校验、结果缓存等。
装饰器的使用语法如下所示:
def decorator_function(original_function):
def wrapper(*args, **kwargs):
# 在函数执行前的逻辑
result = original_function(*args, **kwargs)
# 在函数执行后的逻辑
return result
return wrapper
@decorator_function
def target_function(arg1, arg2):
# 目标函数的实现
pass
在这个例子中,decorator_function
就是一个装饰器,它接收 target_function
作为参数,并返回 wrapper
函数。当我们在 target_function
前面使用 @decorator_function
时,实际上是将 target_function
替换为了 wrapper
函数,因此在调用 target_function
时,实际上会执行经过装饰器包装后的逻辑。
装饰器的作用主要包括:
代码复用:装饰器允许我们将通用功能抽象出来,方便在整个代码库中复用,而不必在每个需要类似功能的地方编写相同的代码。
模块化:装饰器有助于保持代码的模块化,让业务逻辑和辅助功能(如日志、错误处理、性能分析等)分离。
非侵入式增强:装饰器能在不影响原始函数签名和主体逻辑的前提下,为其添加额外功能,保持源代码的整洁。
灵活性:通过装饰器可以轻松地开启或关闭特定功能,这对于调试、配置选项变更或者功能开关等场景非常有用。
例如,一个常见的装饰器应用是用来测量函数执行时间:
import time
def timer_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__} 运行时间为: {end_time - start_time} 秒")
return result
return wrapper
@timer_decorator
def some_function():
# ... 执行耗时的代码 ...
在这个例子中,timer_decorator
装饰器会在 some_function
执行前后记录时间,从而无需在 some_function
内部插入计时代码。