Python中的装饰器
字数 531 2025-11-02 17:10:18
Python中的装饰器
描述:
装饰器是Python中一种强大的语法特性,允许在不修改原函数代码的情况下,动态地增强函数的功能。它本质上是一个高阶函数,接受一个函数作为参数,并返回一个新的函数。装饰器常用于日志记录、性能测试、权限校验等场景。
解题过程:
-
基础概念:函数作为对象
在Python中,函数是一等对象,意味着函数可以像变量一样被传递、赋值或作为其他函数的参数/返回值。例如:def greet(name): return f"Hello, {name}!" # 将函数赋值给变量 my_func = greet print(my_func("Alice")) # 输出:Hello, Alice! -
高阶函数:函数作为参数或返回值
装饰器的核心是高阶函数。例如,一个记录函数执行时间的高阶函数:import time def timer(func): def wrapper(): start = time.time() func() # 执行原函数 end = time.time() print(f"函数执行耗时:{end - start:.2f}秒") return wrapper # 返回新函数 def my_function(): time.sleep(1) # 手动包装函数 my_function = timer(my_function) my_function() # 调用增强后的函数 -
装饰器语法糖:@符号
使用@装饰器名简化包装过程,等价于手动赋值:@timer # 等价于 my_function = timer(my_function) def my_function(): time.sleep(1) my_function() # 直接调用即可增强功能 -
处理带参数的函数
若原函数有参数,需在装饰器内层函数中定义兼容参数:def timer(func): def wrapper(*args, **kwargs): # 接受任意参数 start = time.time() result = func(*args, **kwargs) # 将参数传递给原函数 end = time.time() print(f"执行耗时:{end - start:.2f}秒") return result # 返回原函数的返回值 return wrapper @timer def greet(name, age): return f"{name} is {age} years old." print(greet("Bob", 20)) # 正常传递参数 -
装饰器本身带参数
若需向装饰器传递参数(如@decorator(param=1)),需嵌套两层函数:def repeat(n=3): # 外层接收装饰器参数 def decorator(func): # 中层接收被装饰函数 def wrapper(*args, **kwargs): for _ in range(n): result = func(*args, **kwargs) return result return wrapper return decorator @repeat(n=2) # 指定重复次数 def say_hello(): print("Hello!") say_hello() # 输出两次"Hello!" -
保留原函数的元信息
装饰器会覆盖原函数的名称、文档等元信息,使用functools.wraps修复:from functools import wraps def timer(func): @wraps(func) # 将原函数的元信息复制到wrapper def wrapper(*args, **kwargs): # ... 同上 return wrapper @timer def example(): """示例函数文档""" pass print(example.__name__) # 输出"example"而非"wrapper"
总结:
装饰器通过函数嵌套和参数传递实现功能增强,其核心是理解函数作为对象、闭包和作用域。实际应用中,结合*args、**kwargs和functools.wraps可编写通用且健壮的装饰器。