0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python:装饰器的原理和案例

如意 来源:百家号 作者: 人工智能研究院 2020-07-01 11:35 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Python中的装饰器用于扩展可调用对象的功能,而无需修改其结构。基本上,装饰器函数包装另一个函数以增强或修改其行为。我们可以通过一个具体的例子了解基础知识!让我们编写一个包含装饰器实现示例的Python3代码:

装饰定义

defdecorator_func_logger(target_func):defwrapper_func():print(“Before calling”, target_func.__name__) target_func() print(“After calling”, target_func.__name__)return wrapper_funcdef target(): print(‘Python is in the decorated target function’)dec_func = decorator_func_logger(target)dec_func()Output:air-MacBook-Air:$ python DecoratorsExample.py(‘Before calling’, ‘target’)Python isin the decorated target function(‘After calling’, ‘target’)

上面的装饰器结构有助于我们在调用目标函数之前和之后在控制台上显示一些注释。

以下是定义装饰器的简单步骤;

首先,我们应该定义一个可调用对象,例如装饰器函数,其中还包含一个包装器函数。

装饰器函数应将目标函数作为参数。

并且它应该返回包装函数,该包装函数扩展了作为参数传递的目标函数。

包装函数应包含目标函数调用以及扩展目标函数行为的代码。

defdecorator_func_logger(target_func):defwrapper_func(): print(“Before calling”, target_func.__name__) target_func() print(“After calling”, target_func.__name__)return wrapper_func@decorator_func_loggerdef target():print(‘Python is in the decorated target function’)target()Output:air-MacBook-Air:$ python DecoratorsExample.py(‘Before calling’, ‘target’)Python isin the decorated target function(‘After calling’, ‘target’)

借助Python提供的语法糖,我们可以简化装饰器的定义,如上所示。

请注意,@ decorator_func_logger仅在我们要装饰的目标函数之前添加。然后,我们可以直接调用目标函数。就像我们在第一个实例中所做的那样,无需显式分配装饰器。

定义多个装饰器并使用参数装饰函数

import timedef decorator_func_logger(target_func):defwrapper_func(*args, **kwargs):print(“Before calling”, target_func.__name__) target_func(*args, **kwargs)print(“After calling”, target_func.__name__)return wrapper_funcdef decorator_func_timeit(target_func):defwrapper_func(*args, **kwargs): ts = time.time() target_func(*args, **kwargs) te = time.time()print (target_func.__name__, (te - ts) * 1000)return wrapper_func@decorator_func_logger@decorator_func_timeitdef target(loop): count = 0 print(‘Python is in the decorated target function’)for number in range(loop): count += numbertarget(100)target(3000)Output:air-MacBook-Air:$ python DecoratorsExample.py(‘Before calling’, ‘wrapper_func’)Python isin the decorated target function(‘target’, 0.015974044799804688)(‘After calling’, ‘wrapper_func’)(‘Before calling’, ‘wrapper_func’)Python isin the decorated target function(‘target’, 0.47397613525390625)(‘After calling’, ‘wrapper_func’)

通过使用‘@’语法在目标函数之前添加多个装饰器,可以轻松地用多个装饰器装饰目标函数。装饰器的执行顺序将与在目标函数之前列出的顺序相同。

请注意,我们的目标函数中有一个参数loop。只要包装函数使用相同的参数,就没有问题。为了确保装饰器可以灵活地接受任意数量的参数,将(* args,** kwargs)参数用于包装函数。

重要要点

装饰器定义可重用的代码块,您可以将这些代码块应用于可调用对象(函数,方法,类,对象),以修改或扩展其行为,而无需修改对象本身。

请考虑您的脚本中有许多函数执行许多不同的任务,并且需要向所有函数添加特定的行为。在这种情况下,将相同的代码块复制到函数中以具有所需的功能不是一个好的解决方案。您可以简单地装饰函数。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4423

    浏览量

    68034
  • python
    +关注

    关注

    59

    文章

    4892

    浏览量

    90415
  • 调用
    +关注

    关注

    0

    文章

    8

    浏览量

    3470
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用PYTHON进行的跨平台仿真

    快速物理光学软件VirtualLab Fusion以其“连接场求解”方法而自豪,该方法将应用于不同组件上的专用电磁场求解结合在一起,以实现整个系统的物理光学模拟。这种方法的逻辑扩展不仅是连接软件
    发表于 04-02 08:21

    [VirtualLab] 使用Python运行VirtualLab Fusion光学仿真

    摘要 VirtualLab Fusion允许Python外部访问其建模技术、求解和结果。这个用例介绍了一种使用路径变量和Visual Studio代码将Python连接到VirtualLab
    发表于 03-31 09:39

    [VirtualLab] 使用Python进行跨平台参数扫描

    摘要 VirtualLab Fusion允许外部访问其建模技术、求解和结果。这有助于应用其他数据处理或优化工具来进一步研究光学模拟。在本示例中,我们演示如何使用Python脚本运行参数扫描,以及
    发表于 03-31 09:36

    如何在 VisionFive 上使用 Python 包?

    Fedora 并确保 VisionFive 已连接到互联网。有关详细说明,请参阅通过以太网使用 SSH或使用 USB 转串行转换部分中的VisionFive 单板计算机快速入门指南. 执行pip命令
    发表于 03-30 08:28

    安装 Python VisionFive_GPIO失败是哪里出了问题?

    尽管按照最新的文档,我在安装 VisionFive.gpio 包时仍然收到错误 sudo apt 安装 libxml2-dev libxslt-dev python3 -m pip 安装请求
    发表于 02-11 06:13

    Python运行本地Web服务并实现远程访问

    本文介绍使用Python搭建本地Web服务并结合 ZeroNews 实现公网访问。
    的头像 发表于 02-06 11:39 441次阅读
    <b class='flag-5'>Python</b>运行本地Web服务并实现远程访问

    没有专利的opencv-python 版本

    所有 官方发布的 opencv-python 核心版本(无 contrib 扩展)都无专利风险——专利问题仅存在于 opencv-contrib-python 扩展模块中的少数算法(如早期 SIFT
    发表于 12-13 12:37

    Termux中调试圣诞树Python代码

    python --version 如果输出Python 3.x.x(比如3.11.4),说明安装成功。 二、代码编写(两种方式可选) 方式1:用Termux自带编辑(nano)(新手推荐) 创建并编辑
    发表于 12-09 09:02

    Python调用API教程

    两个不同系统之间的信息交互。在这篇文章中,我们将详细介绍Python调用API的方法和技巧。 一、用Requests库发送HTTP请求 使用Python调用API的第一步是发送HTTP请求,通常
    的头像 发表于 11-03 09:15 1281次阅读

    Python 给 Amazon 做“全身 CT”——可量产、可扩展的商品详情爬虫实战

    一、技术选型:为什么选 Python 而不是 Java? 结论: “调研阶段用 Python,上线后如果 QPS 爆表再考虑 Java 重构。” 二、整体架构速览(3 分钟看懂) 三、开发前准备(5
    的头像 发表于 10-21 16:59 669次阅读
    用 <b class='flag-5'>Python</b> 给 Amazon 做“全身 CT”——可量产、可扩展的商品详情爬虫实战

    termux调试python猜数字游戏

    保存并运行 - `Ctrl+O` → `Enter` 保存文件 - `Ctrl+X` 退出编辑 - 运行命令: ```bash python guess_number.py ``` 2. 游戏
    发表于 08-29 17:15

    termux如何搭建python游戏

    模拟,支持通过APT包管理安装软件。搭建Python游戏开发环境前需完成以下基础配置: 1. 更换国内源 为提升下载速度,需替换Termux默认源为清华源,执行以下命令: ```bash
    发表于 08-29 07:06

    python app不能运行怎么解决?

    ;python_agent[1241]: xmlrpc request method supervisor.stopProcess failed;python_agent[1241]: xmlrpc request method supervisor.stopProces
    发表于 08-06 06:27

    纳祥科技客户案例 | 集计时、照明、装饰于一体的电子沙漏计时方案

    传统沙漏作为计时工具,虽具备仪式感,但存在功能单一、无法实时调整具体定时等局限性。应客户需求,纳祥科技推出了结合LED显示、重力感应、低功耗等技术的电子沙漏计时方案,实现传统沙漏的美学与现代
    的头像 发表于 06-13 16:32 1143次阅读
    纳祥科技客户案例 | 集计时、照明、<b class='flag-5'>装饰</b>于一体的电子沙漏计时<b class='flag-5'>器</b>方案

    跟老齐学Python:从入门到精通

    本帖最后由 yuu_cool 于 2025-6-3 16:52 编辑 本资料是面向编程零基础读者的Python 入门教程,内容涵盖了Python 的基础知识和初步应用。以比较轻快的风格,向零基
    发表于 06-03 16:10