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

    文章

    4329

    浏览量

    62576
  • python
    +关注

    关注

    56

    文章

    4793

    浏览量

    84634
  • 调用
    +关注

    关注

    0

    文章

    8

    浏览量

    3227
收藏 人收藏

    评论

    相关推荐

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

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

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

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

    pytorch和python的关系是什么

    在当今的人工智能领域,Python已经成为了最受欢迎的编程语言之一。Python的易学易用、丰富的库和框架以及强大的社区支持,使其成为了数据科学、机器学习和深度学习等领域的首选语言。而在深度学习领域
    的头像 发表于 08-01 15:27 1902次阅读

    Python中变量在内存中的存储方式

    类方法使用@classmethod装饰定义,它们的第一个参数通常命名为cls,代表类本身。
    的头像 发表于 07-16 16:29 268次阅读

    opencv-python和opencv一样吗

    不一样。OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,它提供了大量的图像和视频处理功能。OpenCV-Python
    的头像 发表于 07-16 10:38 1162次阅读

    用pycharm进行python爬虫的步骤

    PyCharm,然后点击“Create New Project”创建一个新的Python项目。选择一个合适的项目名称和位置,然后选择Python解释。如果您还没有安装Py
    的头像 发表于 07-11 10:11 828次阅读

    如何用python调用浏览的视频?

    linda 我想用python调用浏览的视频。 我使用cv2调用视频流,但是失败了。 URL=\"http://192.168.4.1/face_stream\" cap = cv2.VideoCapture(URL) print(cap.isOpened()) 输出了
    发表于 06-26 08:15

    鸿蒙OS开发实例:【ArkTS类库多线程@Concurrent装饰校验并发函数】

    在使用TaskPool时,执行的并发函数需要使用该装饰修饰,否则无法通过相关校验。从API version 9开始,该装饰支持在ArkTS卡片中使用。
    的头像 发表于 04-02 14:45 668次阅读
    鸿蒙OS开发实例:【ArkTS类库多线程@Concurrent<b class='flag-5'>装饰</b><b class='flag-5'>器</b>校验并发函数】

    鸿蒙OS开发实例:【装饰@Observed@ObjectLink】

    加深对@Observed@ObjectLink 装饰器使用的理解,以小故事做注释
    的头像 发表于 03-28 17:05 1004次阅读
    鸿蒙OS开发实例:【<b class='flag-5'>装饰</b><b class='flag-5'>器</b>@Observed@ObjectLink】

    鸿蒙原生应用开发-ArkTS语言基础类库多线程@Concurrent装饰校验并发函数

    在使用TaskPool时,执行的并发函数需要使用该装饰修饰,否则无法通过相关校验。从API version 9开始,该装饰支持在ArkTS卡片中使用。
    发表于 03-18 10:30

    基于Python的地图绘制教程

    本文将介绍通过Python绘制地形图的方法,所需第三方Python相关模块包括 rasterio、geopandas、cartopy 等,可通过 pip 等方式安装。
    的头像 发表于 02-26 09:53 1199次阅读
    基于<b class='flag-5'>Python</b>的地图绘制教程

    OpenHarmony父子组件单项同步使用:@Prop装饰

    @Prop装饰的变量可以和父组件建立单向的同步关系。@Prop装饰的变量是可变的,但是变化不会同步回其父组件。 说明: 从API version 9开始,该装饰支持在ArkTS卡片中
    的头像 发表于 02-03 10:57 410次阅读
    OpenHarmony父子组件单项同步使用:@Prop<b class='flag-5'>装饰</b><b class='flag-5'>器</b>

    OpenHarmony 定义扩展组件样式:@Extend 装饰

    说明: 从 API version 9 开始,该装饰支持在 ArkTS 卡片中使用。 装饰器使用说明 语法   @Extend(UIComponentName) function
    的头像 发表于 02-01 20:53 269次阅读

    如何使用linux下gdb来调试python程序

    如何使用linux下gdb来调试python程序  在Linux下,可以使用GDB(GNU调试)来调试Python程序。GDB是一个强大的调试工具,可以帮助开发者诊断和修复程序中的错误。在本文
    的头像 发表于 01-31 10:41 2595次阅读

    Python智能家居系统代码介绍

    Python智能家居系统是一种基于Python编程语言开发的智能家居控制系统,在现代家庭中得到了越来越广泛的应用。本文将详细介绍Python智能家居系统的代码实现,包括系统的结构与功能模块、传感
    的头像 发表于 01-25 09:46 1353次阅读