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

    文章

    4385

    浏览量

    65156
  • python
    +关注

    关注

    56

    文章

    4831

    浏览量

    87464
  • 调用
    +关注

    关注

    0

    文章

    8

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    零基础入门:如何在树莓派上编写和运行Python程序?

    在这篇文章中,我将为你简要介绍Python程序是什么、Python程序可以用来做什么,以及如何在RaspberryPi上编写和运行一个简单的Python程序。什么是Python程序?
    的头像 发表于 03-25 09:27 ?890次阅读
    零基础入门:如何在树莓派上编写和运行<b class='flag-5'>Python</b>程序?

    是否可以使用OpenVINO?部署管理在部署机器上运行Python应用程序?

    使用 OpenVINO?部署管理创建运行时软件包。 将运行时包转移到部署机器中。 无法确定是否可以在部署机器上运行 Python 应用程序,而无需安装OpenVINO? Toolkit 和 Python
    发表于 03-05 08:16

    Python绘图Matplotlib快速参考手册

    ?PYTHON
    发表于 02-07 14:04 ?0次下载

    Python Connector for InterBase连接解决方案

    适用于 InterBase 的 Python 连接 Python Connector for InterBase 是一种可靠的连接解决方案,用于从 Python 应用程序访问 Int
    的头像 发表于 01-22 14:34 ?490次阅读

    使用Python实现xgboost教程

    使用Python实现XGBoost模型通常涉及以下几个步骤:数据准备、模型训练、模型评估和模型预测。以下是一个详细的教程,指导你如何在Python中使用XGBoost。 1. 安装XGBoost
    的头像 发表于 01-19 11:21 ?1415次阅读

    适用于MySQL和MariaDB的Python连接:可靠的MySQL数据连接和数据库

    适用于 MySQL 和 MariaDB 的 Python 连接 Python Connector for MySQL 是一种可靠的连接解决方案,用于从 Python 应用程序访问 M
    的头像 发表于 01-17 12:18 ?532次阅读
    适用于MySQL和MariaDB的<b class='flag-5'>Python</b>连接<b class='flag-5'>器</b>:可靠的MySQL数据连接<b class='flag-5'>器</b>和数据库

    适用于Oracle的Python连接:可访问托管以及非托管的数据库

    适用于 Oracle 的 Python 连接 适用于 Oracle 的 Python 连接是一种可靠的连接解决方案,用于从 Python
    的头像 发表于 01-14 10:30 ?509次阅读

    Flexus 云服务 X:Python 安装的极致便捷之旅

    配置和环境设置方面,可能会遇到各种挑战。为了帮助开发者更高效地使用 Flexus 云服务 X,本文将详细介绍如何在 Flexus 云服务 X 上安装 Python,并突出其便捷性。 一
    的头像 发表于 01-07 17:00 ?379次阅读
    Flexus 云服务<b class='flag-5'>器</b> X:<b class='flag-5'>Python</b> 安装的极致便捷之旅

    使用Python进行串口通信的案例

    当然!以下是一个使用Python进行串口通信的简单示例。这个示例展示了如何配置串口、发送数据以及接收数据。我们将使用 pyserial 库,这是一个非常流行的用于串口通信的Python库。 首先,你
    的头像 发表于 11-22 09:11 ?1559次阅读

    Python环境下的代理服务搭建与自动化管理

    Python环境下搭建与自动化管理代理服务是一项涉及网络编程和自动化技术的综合任务。
    的头像 发表于 11-14 07:31 ?719次阅读

    Python中代理服务的配置与应用

    在网络通信中,代理服务作为一种重要的网络中间件,充当着客户端和目标服务之间的中间人角色。它能够接收来自客户端的请求,并将这些请求转发给目标服务,然后将服务的响应返回给客户端。
    的头像 发表于 11-12 07:13 ?597次阅读

    使用Python进行图像处理

    下面是一个关于使用Python在几行代码中分析城市轮廓线的快速教程。
    的头像 发表于 11-07 10:14 ?633次阅读
    使用<b class='flag-5'>Python</b>进行图像处理

    使用Python构建高效的HTTP代理服务

    构建一个高效的HTTP代理服务Python中涉及多个方面,包括性能优化、并发处理、协议支持(HTTP/HTTPS)、错误处理以及日志记录等。
    的头像 发表于 10-23 07:41 ?575次阅读

    【每天学点AI】一个例子带你了解Python装饰到底在干嘛!

    今天我们来聊聊一种能给你的代码变得“加料”的神器——Python装饰。就像一杯咖啡,原本它是苦的,为了让它符合我的口味,我给它添加了糖,添加之后就完美的符合了我的口味。那么,装饰
    的头像 发表于 09-20 16:54 ?819次阅读
    【每天学点AI】一个例子带你了解<b class='flag-5'>Python</b><b class='flag-5'>装饰</b><b class='flag-5'>器</b>到底在干嘛!

    使用Python进行Ping测试

    )请求包,然后等待目标主机返回响应包,从而测量网络的延迟和丢包情况。随着Python编程语言的广泛应用,越来越多的网络工程师开始使用Python进行自动化网络测试和管理任务。本篇文章将详细介绍如何使用Python进行Ping测试
    的头像 发表于 08-12 17:56 ?1071次阅读
    使用<b class='flag-5'>Python</b>进行Ping测试