博客
关于我
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/

    你可能感兴趣的文章
    pythonsign函数_对python函数签名的方法详解 用python怎么写一个自签名证书
    查看>>
    PythonStudy
    查看>>
    Pythons__IMPORT__未按预期工作
    查看>>
    Pythont通过request以及BeautifulSoup爬取几千条情话
    查看>>
    pythonweb django的学习
    查看>>
    pythonweb网站开发基础django安装
    查看>>
    pythonweb网站开发基础创建django项目
    查看>>
    pythonweb网站开发基础添加应用
    查看>>
    Python_015 多线程
    查看>>
    python_73_pickle序列化(接72)
    查看>>
    python_code_418
    查看>>
    python_day10 协程 GEVENT
    查看>>
    python_day1作业
    查看>>
    Python接口自动化测试必备基础之http协议详解!
    查看>>
    python_IDE开发环境使用_建立Python源文件---python工作笔记011
    查看>>
    Python_web框架解析
    查看>>
    Python__Enter__/__Exit__vs__init__(或__new__)/__del__
    查看>>
    python_对象的基本组成和内存示意图---python工作笔记016
    查看>>
    python_开发环境介绍_交互模式使用_IDE介绍和使用---python工作笔记010
    查看>>
    python_引用的本质_栈内存和堆内存_内存示意图---python工作笔记017
    查看>>