本文共 1547 字,大约阅读时间需要 5 分钟。
在 Python 中,装饰器是一种常用的设计模式,用于在不修改原函数 signatures 的情况下,向函数中添加额外的功能。这种模式通过定义一个包装函数(wrapper),将原始函数(target function)进行包装,从而扩展其功能。以下是装饰器的固定模式:
def wrapper(f): def inner(*args, **kwargs): # 这里可以添加被装饰函数执行前的代码 ret = f(*args, **kwargs) # 这里可以添加被装饰函数执行后的代码 return ret return inner# 调用方式@wrapper
wrapper 函数:这是一个装饰器函数,它接收目标函数 f 作为参数。inner 函数:wrapper 返回的函数,用于包装被装饰函数 f。它接受任意数量的参数 *args 和关键字参数 **kwargs。inner 函数中,可以在 f 被调用之前添加任何预处理逻辑。f 被调用之后,可以在 inner 函数中添加任何后处理逻辑。inner 函数返回 f 的调用结果 ret。假设我们有一个需要计时的函数 func:
@wrapperdef func(): print("执行函数 func") 在执行 func() 时,装饰器会自动调用 wrapper,进而调用 inner。inner 函数会记录函数执行的时间:
def wrapper(f): def inner(): start = time.time() ret = f() end = time.time() print(f"函数 {f.__name__} 执行时间:{end - start}") return ret return inner@wrapperdef func(): time.sleep(0.01) print("执行函数 func") inner 函数可以接收任意数量的参数和关键字参数,这使得它可以像普通函数一样调用。f.__name__,可以获取被装饰函数的原始名称,方便日志记录。装饰器广泛用于以下场景:
对于更复杂的场景,可以进一步优化装饰器的实现:
from functools import wrapsdef decorator(f): @wraps(f) def wrapper(*args, **kwargs): start = time.time() result = f(*args, **kwargs) end = time.time() print(f"函数 {f.__name__} 执行时间:{end - start}") return result return wrapper 装饰器是一种强大的设计模式,能够在不修改函数签名的情况下,向函数中添加新的功能。通过定义一个包装函数,可以轻松地为函数添加计时、日志、错误处理等功能,从而提高代码的可维护性和扩展性。
转载地址:http://ptlfk.baihongyu.com/