以下是关于装饰器、迭代器与生成器的详细介绍以及相应案例说明:
一、装饰器
1. 概念
装饰器是Python中一种用于修改或扩展函数、类功能的语法结构,它本质上是一个函数,接收一个函数(或类)作为参数,并返回一个新的函数(或类),新的函数(或类)通常会在原函数(或类)的基础上添加一些额外的功能,比如日志记录、性能测试、权限验证等,且不需要修改原函数(或类)的代码,遵循了“开闭原则”(对扩展开放,对修改关闭)。
2. 语法格式
使用 @
符号加上装饰器函数名来应用装饰器,例如:
@decorator_function
def my_function():
pass
等同于:
def my_function():
pass
my_function = decorator_function(my_function)
3. 案例
案例一:简单的日志记录装饰器
import logging
def log_decorator(func):
def wrapper(*args, **kwargs):
logging.info(f"Calling function {
func.__name__}")
result = func(*args, **kwargs)
logging.info(f"Function {
func.__name__} completed")
return result
return wrapper
@log_decorator
def add_numbers(a, b):
return a + b
result = add_numbers(3, 5)
print(result)
解释:
- 首先导入了Python的标准日志模块
logging
,用于记录函数调用的相关信息。 - 接着定义了
log_decorator
装饰器函数,它接收一个函数func
作为参数。在装饰器内部,定义了一个名为wrapper
的内部函数,这个函数会在原函数被调用时执行。 - 在
wrapper
函数中,首先使用logging.info
记录了一条日志信息,表示正在调用的函数名称(通过func.__name__
获取函数名),然后调用原函数func
,并传入接收到的所有位置参数*args
和关键字参数**kwargs
,将原函数的返回结果保存到result
变量中,接着又记录了一条日志信息表示函数调用完成,最后返回原函数的执行结果result
。 - 之后定义了
add_numbers
函数,用于计算两个数相加,并使用@log_decorator
语法将log_decorator
装饰器应用到add_numbers
函数上。这样,当调用add_numbers
函数时,实际上执行的是经过装饰器包装后的wrapper
函数,会自动记录函数调用前后的日志信息,最后打印出两数相加的结果8
。
案例二:权限验证装饰器
def check_permission(role):
def decorator(func):
def wrapper(*args, **kwargs):
if role == "admin":
return func(*args, **kwargs)
else:
raise PermissionError("You don't have permission to access this function.")
return wrapper
return decorator
@check_permission("admin")
def delete_data():
print("Data has been deleted.")
try:
delete_data()
except PermissionError as e:
print(e)
解释:
- 首先定义了
check_permission
函数,它接收一个表示角色的参数role
,并返回一个装饰器函数decorator
。这个check_permission
函数起到了一个参数化装饰器的作用,允许根据不同的角色来设置权限验证逻辑。 - 在
decorator
函数内部,又定义了wrapper
函数,它接收原函数的参数*args
和**kwargs
。在wrapper
函数中,会判断传入的角色role
是否为"admin"
,如果是,则调用原函数func
并返回其结果,否则抛出PermissionError
异常,表示没有权限访问该函数。 - 接着定义了
delete_data
函数,用于模拟删除数据的操作,并使用@check_permission("admin")
将装饰器应用到delete_data
函数上,意味着只有当角色为"admin"
时才能执行这个函数。 - 最后通过
try-except
语句块来调用delete_data
函数,若有权限则正常执行函数并打印出相应提示,若没有权限则捕获PermissionError
异常并打印出异常信息,体现了装饰器在权限验证方面的应用,通过装饰器可以方便地为不同的函数添加统一的权限验证逻辑,而无需在每个函数内部重复编写验证代码。
案例三:计算函数执行时间的装饰器(性能测试)
import time
def timeit_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"Function {
func.__name__} took {
end_time - start_time} seconds to execute.")
return result
return wrapper
@timeit_decorator
def slow_function():
time<