博客
关于我
python中的装饰器基础
阅读量:796 次
发布时间:2023-03-09

本文共 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/

    你可能感兴趣的文章
    python系列【仅供参考】:python斗地主
    查看>>
    Python基础教程(第2版 修订版) pdf
    查看>>
    python基础实践(四)
    查看>>
    Python基础学习笔记(九)常用数据类型转换函数
    查看>>
    Python基础学习参考(五):字符串和编码
    查看>>
    Python基础学习
    查看>>
    python基础变量之---集合
    查看>>
    python基础变量之---字典
    查看>>
    python基础变量之---列表
    查看>>
    python基础变量之---元组
    查看>>
    python固定后缀(名物化词汇)词频统计:抽取+统计+可视化
    查看>>
    python商品数据分析可视化系统(带爬虫)京东销售数据分析 计算机毕业设计 源码下载
    查看>>
    Python命名中尾随下划线有什么好处?
    查看>>
    python吊打Excel?屁!那是你不会用!
    查看>>
    Python合并两张图片 | 先叠透明度再合并 (附Demo)
    查看>>
    python各进制的表述与转换
    查看>>
    python各种库安装
    查看>>
    python可视化matplotlib_如何使用Python中最强大的可视化工具Matplotlib?
    查看>>
    python可维护性_使用这7大神器,让你的Python 代码更容易于维护
    查看>>
    python变量的详细教程_Python零基础入门教程之语法入门[变量](第二期)
    查看>>