Python:decorator 库高级用法举例和应用详解

Python Decorator Advanced Usage

模块介绍

decorator 模块是 Python 标准库中的一个强大工具,它主要用于简化装饰器的创建。在 Python 3.x 版本中,decorator 库提供了一种方便的方法来编写装饰器,使得用户可以更轻松地添加额外的功能到现有的函数或方法上,而无需修改它们的原始代码。适用于 Python 3.4 及以上版本。

应用场景

decorator 库的主要用途是为函数或类添加额外功能,而不改变原有函数的逻辑。这在多种场景中非常实用,包括:

  1. 日志记录:自动记录函数调用的参数和返回值,以便后续调试。
  2. 权限校验:在执行某个函数前,检查用户权限,确保只有合法用户才能执行。
  3. 性能监控:测量函数的执行时间,并输出性能报告。

这些应用场景充分展示了 decorator 在日常编程中的灵活性和实用性。

安装说明

decorator 模块是 Python 的内置标准库,无需单独安装。使用时只需导入即可。

1
2
import functools  # 导入functools模块以便处理函数的装饰器
from decorator import decorator # 从decorator库导入decorator函数

用法举例

1. 日志记录装饰器

我们想要在每次调用某个函数时,记录下其调用的参数和返回值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import logging  # 导入日志模块
from functools import wraps # 导入wraps用于装饰器

# 设置日志配置
logging.basicConfig(level=logging.INFO)

# 创建装饰器
def log_function_call(func):
@wraps(func) # 保留原函数的信息
def wrapper(*args, **kwargs):
logging.info(f"Calling {func.__name__} with args: {args}, kwargs: {kwargs}") # 记录调用信息
result = func(*args, **kwargs) # 调用原函数
logging.info(f"{func.__name__} returned: {result}") # 记录返回值
return result
return wrapper

@log_function_call # 应用装饰器
def add(a, b):
return a + b # 返回两个数的和

add(1, 2) # 调用add函数,日志中将记录调用信息

2. 权限校验装饰器

创建一个装饰器,用于检查用户是否有权限执行某项操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from functools import wraps

def require_permission(permission):
def decorator(func):
@wraps(func)
def wrapper(user, *args, **kwargs):
if permission in user['permissions']: # 检查用户权限
return func(user, *args, **kwargs) # 有权限则调用原函数
else:
raise PermissionError("User does not have permission to perform this action.") # 无权限抛出异常
return wrapper
return decorator

@require_permission('admin') # 应用装饰器,需admin权限
def delete_user(user, user_id):
return f"User {user_id} deleted" # 删除用户

try:
user = {'name': 'John', 'permissions': ['user']} # 模拟用户数据
delete_user(user, 123) # 尝试删除用户,将引发权限异常
except PermissionError as e:
print(e) # 输出异常信息

3. 性能监控装饰器

编写一个装饰器,用于测量函数的执行时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import time  # 导入时间模块
from functools import wraps

def time_it(func):
@wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time() # 记录开始时间
result = func(*args, **kwargs) # 调用原函数
elapsed_time = time.time() - start_time # 计算执行时间
print(f"{func.__name__} executed in: {elapsed_time:.4f} seconds") # 输出执行时间
return result
return wrapper

@time_it # 应用装饰器
def slow_function(n):
time.sleep(n) # 模拟耗时操作
return "Function finished"

slow_function(2) # 调用慢函数,将输出执行时间

强烈建议大家关注我的博客(全糖冲击博客),这里提供了全面的 Python 标准库使用教程,方便大家查询和学习。我的博客不仅包括各个 Python 库的详细使用说明,还涵盖了大量的实际案例和最佳实践,有助于提高你的编程技能和效率。在这个信息丰富的平台上,你不仅能学到基本知识,还会发掘到许多高级用法和技巧,助你成为一个更出色的开发者。期待你的加入,让我们一起学习,共同进步!