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

Python装饰器演化过程

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

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

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

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

场景

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

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

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

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

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

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

函数名字是变量名而已

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

mystr = 'xxxx'

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

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

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

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

NameError: name 'mysum' is not defined

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

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

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

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

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

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

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

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

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

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

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

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

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

函数传递

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • K60至尊版刚预热 一加Ace2 Pro正面硬刚

    Redmi这边刚如火如荼的宣传了K60 Ultra的各种技术和硬件配置,作为竞品的一加也坐不住了。一加中国区总裁李杰发布了两条微博,表示在自家的一加Ace2上早就已经采用了和PixelWo
  • Redmi Buds 4开箱简评:才199还有降噪 可以无脑入

    在上个月举办的Redmi Note11T Pro系列新机发布会上,除了两款手机新品之外,Redmi还带来了两款TWS真无线蓝牙耳机产品,Redmi Buds 4和Redmi Buds 4 Pro,此前我们在Redmi Note11T
  • 如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • 一篇文章带你了解 CSS 属性选择器

    属性选择器对带有指定属性的 HTML 元素设置样式。可以为拥有指定属性的 HTML 元素设置样式,而不仅限于 class 和 id 属性。一、了解属性选择器CSS属性选择器提供了一种简单而
  • “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 消息称小米汽车开始筛选交付中心:需至少120个车位

    IT之家 7 月 7 日消息,日前,有微博简介为“汽车行业从业者、长三角一体化拥护者”的微博用户 @长三角行健者 发文表示,据经销商集团反馈,小米汽车目前
  • 三星Galaxy Z Fold5官方渲染图曝光:13.4mm折叠厚度依旧感人

    据官方此前宣布,三星将于7月26日在韩国首尔举办Unpacked活动,届时将带来带来包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy Z Flip 5、
  • 电博会与软博会实现"线下+云端"的双线融合

    在本次“电博会”与“软博会”双展会利好条件的加持下,既可以发挥展会拉动人流、信息流、资金流实现快速交互流动的作用,继而推动区域经济良性发展;又可以聚
Top