当前位置:首页 > 科技  > 软件

Python装饰器演化过程

来源: 责编: 时间:2023-12-11 17:18:57 435观看
导读Python 的装饰器可能是很多初学者难以搞懂的知识点之一,其实以前我也有讲解这方面的知识,不过那是在 pandas 专栏里面。今天以另一个角度再次讲解装饰器。场景先看看一开始的代码:行2:这是今天我们需要实现的装饰器函数行

Python 的装饰器可能是很多初学者难以搞懂的知识点之一,其实以前我也有讲解这方面的知识,不过那是在 pandas 专栏里面。9T428资讯网——每日最新资讯28at.com

今天以另一个角度再次讲解装饰器。9T428资讯网——每日最新资讯28at.com

9T428资讯网——每日最新资讯28at.com

场景

先看看一开始的代码:9T428资讯网——每日最新资讯28at.com

9T428资讯网——每日最新资讯28at.com

  • 行2:这是今天我们需要实现的装饰器函数
  • 行5:装饰器函数可以作用到任意其他的函数上
  • 行10:每当调用被装饰的函数,就会在执行函数之前打印一句内容,运行结束后,打印结果内容

比如 行10 执行后,后台会输出。9T428资讯网——每日最新资讯28at.com

9T428资讯网——每日最新资讯28at.com

接下来,我们一步步实现 faker 函数。9T428资讯网——每日最新资讯28at.com

函数名字是变量名而已

前面定义的函数 mysum ,只不过是一个普通变量。就像你用一个变量保存了一个字符串一样:9T428资讯网——每日最新资讯28at.com

mystr = 'xxxx'

只不过函数是表达一段代码(逻辑)。怎么证明?9T428资讯网——每日最新资讯28at.com

python 中可以用 del 关键字删除一个变量:9T428资讯网——每日最新资讯28at.com

9T428资讯网——每日最新资讯28at.com

行12 会报错:9T428资讯网——每日最新资讯28at.com

NameError: name 'mysum' is not defined

不怕,可以先用另一个变量"接住"函数对象:9T428资讯网——每日最新资讯28at.com

9T428资讯网——每日最新资讯28at.com

行8:注意了,mysum 后面没有带括号。因为函数名 + 括号,才是执行函数体内的代码。只是写函数名字,实际上并没有执行函数。9T428资讯网——每日最新资讯28at.com

好了,到此为止,下面是初始版本的 faker:9T428资讯网——每日最新资讯28at.com

9T428资讯网——每日最新资讯28at.com

非常简单了,应该大家都能理解。不过现在 faker 一点都不像 mysum 呀!调用是这样子的:9T428资讯网——每日最新资讯28at.com

9T428资讯网——每日最新资讯28at.com

而且参数 1 和 2 还固定写在了 faker 里面。9T428资讯网——每日最新资讯28at.com

那么,先解决参数的问题吧,非常简单,设置两个参数就可以:9T428资讯网——每日最新资讯28at.com

9T428资讯网——每日最新资讯28at.com

用上一开始的"变量假冒法" :9T428资讯网——每日最新资讯28at.com

9T428资讯网——每日最新资讯28at.com

但 faker 函数里面仍然有一个固定的东西(行8),那个 other_func 变量永远指向 mysum 函数(行4)。我们希望 faker 函数可以假冒任意的函数。9T428资讯网——每日最新资讯28at.com

函数传递

我们既然学会了"变量假冒法",那么就能知道,函数对象其实与普通的数据差不多,是可以通过参数传入另一个函数中。9T428资讯网——每日最新资讯28at.com

9T428资讯网——每日最新资讯28at.com

  • 行6:新增一个参数,让外面把 mysum 传进来吧,这样子就变动态了
  • 行12:传入 mysum 函数。注意,mysum 后面是没有括号,我们没有执行 mysum 函数本身

但是显然,现在代码报错了,因为 faker 函数原来的两个变量 a 和 b 没有了。就算把 a 和 b 加上,也不行:9T428资讯网——每日最新资讯28at.com

9T428资讯网——每日最新资讯28at.com

我们并不是要在行12那里执行函数。怎么办?9T428资讯网——每日最新资讯28at.com

other_func 参数肯定是需要的,只是直接放在 faker 不行而已。那么就多搞一个函数吧:9T428资讯网——每日最新资讯28at.com

9T428资讯网——每日最新资讯28at.com

胜利的曙光已经出现了。9T428资讯网——每日最新资讯28at.com

上面 vs code 已经提示出两个错误。一个个来。9T428资讯网——每日最新资讯28at.com

第一个问题,行16,我们希望 real_faker 调用后,返回 faker 函数本身。9T428资讯网——每日最新资讯28at.com

简单:9T428资讯网——每日最新资讯28at.com

9T428资讯网——每日最新资讯28at.com

可以看到 行16 没有提示错误了。9T428资讯网——每日最新资讯28at.com

第二个问题,行12,找不着变量 other_func 。9T428资讯网——每日最新资讯28at.com

简单,在函数 real_faker 中,不就有一个大大的参数 other_func 。把整个 faker 函数移进去就可以:9T428资讯网——每日最新资讯28at.com

9T428资讯网——每日最新资讯28at.com

现在 real_faker 就是带有装饰器效果。不过,可以看到,每次我们要装饰一个函数,都必须写上 行17 的代码。9T428资讯网——每日最新资讯28at.com

所以,python 提供了一个简化的语法。9T428资讯网——每日最新资讯28at.com

9T428资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-42204-0.htmlPython装饰器演化过程

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 京东员工内网“谏言”刘强东原文部分内容曝光:促销简化推进一半,为何没声了

下一篇: PyTorch 亲自出手,少量代码让大模型推理提速10倍!

标签:
  • 热门焦点
  • Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • 6月安卓手机好评榜:魅族20 Pro蝉联冠军

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年6月1日至6月30日,仅限国内市场。第一名:魅族20 Pro好评率:95%5月份的时候魅族20 Pro就是
  • 28个SpringBoot项目中常用注解,日常开发、求职面试不再懵圈

    前言在使用SpringBoot开发中或者在求职面试中都会使用到很多注解或者问到注解相关的知识。本文主要对一些常用的注解进行了总结,同时也会举出具体例子,供大家学习和参考。注解
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    来源:极点商业作者:杨铭在淘宝购买珠宝玉石后,因为保证金不够赔付,店铺关闭,退货退款难、维权无门的比比皆是。“提供相关产品鉴定证书,支持全国复检,可以30天无理由退换货。&
  • 华为Mate60标准版细节曝光:经典星环相机模组回归

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • 2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  • 联想的ThinkBook Plus下一版曝光,键盘旁边塞个平板

    ThinkBook Plus 是联想的一个特殊笔记本类别,它在封面放入了一块墨水屏,也给人留下了较为深刻的印象。据有人爆料,联想的下一款 ThinkBook Plus 可能更特殊,它
Top