Python 装饰器是一种高级功能,允许你在不修改原始函数代码的情况下,动态地修改或扩展函数的行为。
基本语法
装饰器是一种特殊的函数,其基本语法如下:
def decorator_function(func): def wrapper(*args, **kwargs): # 在调用原始函数之前的操作 result = func(*args, **kwargs) # 在调用原始函数之后的操作 return result return wrapper
常用命令
@decorator_function
:将装饰器应用到函数上的语法糖。decorator_function
:装饰器函数本身。
示例
示例 1:简单装饰器
def my_decorator(func): def wrapper(): print("Something is happening before the function is called.") func() print("Something is happening after the function is called.") return wrapper @my_decorator def say_hello(): print("Hello!") say_hello()
示例 2:带参数的装饰器
def repeat(num_times): def decorator_repeat(func): def wrapper(*args, **kwargs): for _ in range(num_times): result = func(*args, **kwargs) return result return wrapper return decorator_repeat @repeat(num_times=3) def greet(name): print(f"Hello {name}") greet("Alice")
应用场景
1. 日志记录
装饰器在日志记录中发挥着重要作用,它可以捕获函数的输入参数、执行时间以及输出结果,从而方便开发人员跟踪函数的执行过程和调试代码。通过装饰器记录日志,可以提高代码的可读性和可维护性。
示例代码:
import logging import time def log_decorator(func): def wrapper(*args, **kwargs): logging.info(f"Calling function {func.__name__} with args: {args}, kwargs: {kwargs}") start_time = time.time() result = func(*args, **kwargs) end_time = time.time() logging.info(f"Function {func.__name__} executed in {end_time - start_time} seconds with result: {result}") return result return wrapper @log_decorator def add(x, y): return x + y result = add(3, 5) print("Result:", result)
2. 性能监控
装饰器在性能监控方面也具有重要作用,它可以帮助开发人员监控函数的执行时间,发现潜在的性能瓶颈并进行优化。通过装饰器进行性能监控,可以提高代码的效率和性能。
示例代码:
import time def performance_decorator(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print(f"Function {func.__name__} executed in {end_time - start_time} seconds") return result return wrapper @performance_decorator def calculate_factorial(n): factorial = 1 for i in range(1, n + 1): factorial *= i return factorial result = calculate_factorial(10) print("Factorial:", result)
3. 权限验证
装饰器可以用于权限验证,例如检查用户是否具有执行特定操作的权限。这种方式使得权限验证逻辑与业务逻辑分离,提高了代码的模块化和可维护性。
示例代码:
def permission_required(permission): def decorator(func): def wrapper(*args, **kwargs): if check_permission(permission): return func(*args, **kwargs) else: raise PermissionError("Permission denied") return wrapper return decorator def check_permission(permission): # 检查用户是否具有指定权限的逻辑 return True # 此处仅为示例,实际需根据业务逻辑实现 @permission_required("admin") def delete_user(user_id): # 删除用户的逻辑 print(f"User {user_id} deleted successfully") delete_user(123)
注意事项
1. 装饰器顺序
当多个装饰器应用于同一个函数时,它们的执行顺序与它们在代码中的顺序相反。这意味着最先定义的装饰器实际上会最后执行,而最后定义的装饰器会最先执行。
示例代码:
def decorator1(func): def wrapper(): print("Decorator 1 executed") func() return wrapper def decorator2(func): def wrapper(): print("Decorator 2 executed") func() return wrapper @decorator1 @decorator2 def greet(): print("Hello!") greet()
输出结果为:
Decorator 1 executed Decorator 2 executed Hello!
2. 装饰器的参数
如果装饰器本身需要接受参数,则需要在装饰器函数外再包裹一层函数。这样的装饰器称为带参数的装饰器。在定义带参数的装饰器时,外层函数接受装饰器参数,内层函数接受被装饰函数。
示例代码:
def decorator_with_param(param): def decorator(func): def wrapper(): print(f"Decorator with parameter {param} executed") func() return wrapper return decorator @decorator_with_param("test") def greet(): print("Hello!") greet()
输出结果为:
Decorator with parameter test executed Hello!
总结
装饰器是 Python 中一种强大的工具,可用于动态修改函数的行为,常用于日志记录、性能监控、权限验证等场景。通过合理使用装饰器,可以提高代码的灵活性、可重用性和可维护性。