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

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

3天内不再提示

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

华清远见工控 2024-09-20 16:54 次阅读

今天我们来聊聊一种能给你的代码变得“加料”的神器——Python装饰器

wKgaombtOEaAGfC5AAAT2kZ9brI20.jpeg

就像一杯咖啡,原本它是苦的,为了让它符合我的口味,我给它添加了糖,添加之后就完美的符合了我的口味。

那么,装饰器又是如何给代码进行“加料”呢?

Python装饰器提供了一个更为优雅的方式来增强现有函数的行为,并且不需要修改现有的函数代码及调用方式。

接下来通过一个案例来介绍一下装饰器的原理和实际的行为。

这里有一个函数,他就像一个勤劳的快递员,每次运行都送一次快递。

现在我们想知道它每次送快递需要多长时间,这时候装饰器就派上用场了,我们可以使用装饰器来给它添加计时的功能。

wKgZombtOEaANYQJAAI8Tn6EY6E351.png

这是使用语法糖给函数添加装饰器的用法。

下面的部分称为原函数,上面的部分称装饰器函数,此时去调用原函数时,它除了会执行原本的功能外,还会执行装饰器给它添加的计时的功能。

这是装饰器最常见的写法,但它是怎么给函数增加新功能的呢?我们来看去除掉语法糖后装饰器的本来面目。

wKgaombtOEaAIlraAAH6JFu33BI380.png

如果不使用语法糖,它本质上就是装饰器函数的一次调用,特殊的是它会将原函数作为参数传递给装饰器函数。而在装饰器函数中,它接收一个函数作为参数,并且在它的内部定义了一个新的函数,最后将新函数进行返回。在这里我们称timer decorator为外函数,称wrapper为内函数,而这个func就是原函数。

外函数将内函数名称进行返回并赋值为原函数的函数名,下面在调用原函数的函数名时,实际上调用的是内函数。

wKgZombtOEaAffBSAAJ6ik9mlK4531.png

内函数被执行后,首先会记录当前时间,然后调用func,func是什么?是外函数的形参,这里可能有人会疑惑,外函数已经执行完了,为什么func还会存在呢?

这其实就是装饰器函数的立身之本:内函数所使用的外函数数据不会随着外函数的调用而销毁,所以此时func就指向了原函数,在调用内函数时,这里的func()可以去执行原函数,接着记录一下时间,最后通过差值得到执行函数所需要的时间。至此,通过装饰器我们不仅为原函数添加了新的功能,并且还没有修改其调用方式。

而语法糖的存在就是为了省略这一行代码,由此就形成了我们常见的装饰器了。

完整视频链接:

https://www.bilibili.com/video/BV1fGHDepExY?t=1.2

wKgZombtOEaAXSlfAAKZ3-dCif803.jpeg


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

    关注

    87

    文章

    28924

    浏览量

    266295
  • 人工智能
    +关注

    关注

    1787

    文章

    46074

    浏览量

    235171
  • python
    +关注

    关注

    53

    文章

    4753

    浏览量

    84092
收藏 人收藏

    评论

    相关推荐

    PythonAI中的应用实例

    Python人工智能(AI)领域的应用极为广泛且深入,从基础的数据处理、模型训练到高级的应用部署,Python都扮演着至关重要的角色。以下将详细探讨
    的头像 发表于 07-19 17:16 630次阅读

    TVS管与稳压二极管,区别到底在哪里!

    TVS管与稳压二极管,区别到底在哪里!
    的头像 发表于 12-05 14:49 695次阅读
    TVS管与稳压二极管,区别<b class='flag-5'>到底在</b>哪里!

    python写完程序之后怎么运行

    Python程序的执行流程有更深入的了解Python程序的基本结构 Python程序是由
    的头像 发表于 11-22 11:10 844次阅读

    for循环的基本例子

    例子:计算从1到10的整数的总和。在这个例子中,我们需要使用for循环来重复执行累加操作,将每个整数加到总和中。 代码如下所示: int sum = 0; // 初始化总和为0
    的头像 发表于 11-22 10:00 1769次阅读

    Python中如何表达复数

    Python中,可以使用j或J来表示虚部。 以下是关于Python中复数的详细介绍: 创建复数 要创建复数,可以直接使用复数的实部和虚部来赋值给
    的头像 发表于 11-21 16:50 1848次阅读

    python里怎么写数的立方

    Python中,我们可以使用运算符和函数来计算数的立方。下面我将详细介绍如何使用这些方法来实现这个功能。 首先,我们可以使用乘法运算符 ** 来计算数的立方。例如,如果我们有
    的头像 发表于 11-21 16:47 2680次阅读

    python中if三条件怎么写

    确定程序的执行路径。这时,我们可以使用 if-elif-else 结构来处理多个条件。 if-elif-else 结构是被广泛使用的控制结构,许多编程语言中都有类似的实现。它允许我们依次测试多个条件,并根据条件的真假执行相
    的头像 发表于 11-21 16:42 966次阅读

    python输出list的每一个元素

    使用for循环来遍历列表,并输出其中的每一个元素。接下来,我将详尽、详实、细致地介绍Python输出列表的每一个元素的方法,希望能对你有所帮助。 首先,我们需要明确
    的头像 发表于 11-21 16:16 1127次阅读

    python最简单for循环例子

    Python中,for循环可以用来遍历任何可迭代对象,比如列表、元组、字符串等等。我们可以使用for关键字和in关键字来编写简单的for循环。 让我们来看
    的头像 发表于 11-21 14:53 781次阅读

    如何写简单的装饰

    要的是,它让 Python 中被装饰装饰后的方法长得更像装饰前的方法。 本篇文章不会过多的向你介绍装饰
    的头像 发表于 11-01 09:54 407次阅读
    如何写<b class='flag-5'>一</b><b class='flag-5'>个</b>简单的<b class='flag-5'>装饰</b><b class='flag-5'>器</b>

    Python 自制简单实用的日志装饰

    写代码的时候,往往会漏掉日志这个关键因素,导致功能在使用的时候出错却无法溯源。 其实,只需要写非常简单的日志装饰,我们就能大大提升排
    的头像 发表于 10-31 15:05 430次阅读
    <b class='flag-5'>Python</b> 自制简单实用的日志<b class='flag-5'>装饰</b><b class='flag-5'>器</b>

    Python自制简单实用的日志装饰

    写代码的时候,往往会漏掉日志这个关键因素,导致功能在使用的时候出错却无法溯源。 其实,只需要写非常简单的日志装饰,我们就能大大提升排
    的头像 发表于 10-21 14:39 627次阅读
    <b class='flag-5'>Python</b>自制简单实用的日志<b class='flag-5'>装饰</b><b class='flag-5'>器</b>

    详解pcb光学点是什么

    详解pcb光学点是什么
    的头像 发表于 10-12 10:36 1376次阅读

    装饰模式和代理模式的区别

    什么是装饰模式 装饰模式(Decorator Pattern): 不改变对象自身的基础上,
    的头像 发表于 10-08 14:25 2697次阅读
    <b class='flag-5'>装饰</b><b class='flag-5'>器</b>模式和代理模式的区别

    OpenHarmony装饰指定自定义组件:@BuilderParam装饰

    UI描述的元素,类似slot占位符。 说明: 从API version 9开始,该装饰支持ArkTS卡片中使用。
    发表于 09-27 16:02