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

Python装饰器演化过程

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

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

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

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

场景

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

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

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

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

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

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

函数名字是变量名而已

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

mystr = 'xxxx'

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

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

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

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

NameError: name 'mysum' is not defined

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

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

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

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

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

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

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

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

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

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

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

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

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

函数传递

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • Automa-通过连接块来自动化你的浏览器

    1、前言通过浏览器插件可实现自动化脚本的录制与编写,具有代表性的工具就是:Selenium IDE、Katalon Recorder,对于简单的业务来说可快速实现自动化的上手工作。Selenium IDEKat
  • 三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 量化指标是与非:挽救被量化指标扼杀的技术团队

    作者 | 刘新翠整理 | 徐杰承本文整理自快狗打车技术总监刘新翠在WOT2023大会上的主题分享,更多精彩内容及现场PPT,请关注51CTO技术栈公众号,发消息【WOT2023PPT】即可直接领取
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 零售大模型“干中学”,攀爬数字化珠峰

    文/侯煜编辑/cc来源/华尔街科技眼对于绝大多数登山爱好者而言,攀爬珠穆朗玛峰可谓终极目标。攀登珠峰的商业路线有两条,一是尼泊尔境内的南坡路线,一是中国境内的北坡路线。相
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 阿里瓴羊One推出背后,零售企业迎数字化新解

    作者:刘旷近年来随着数字经济的高速发展,各式各样的SaaS应用服务更是层出不穷,但本质上SaaS大多局限于单一业务流层面,对用户核心关切的增长问题等则没有提供更好的解法。在Saa
  • 重估百度丨大模型,能撑起百度的“今天”吗?

    自象限原创 作者|程心 罗辑2023年之前,对于自己的“今天”,百度也很迷茫。“新业务到 2022 年底还是 0,希望 2023 年出来一个 1。”这是2022年底,李彦宏
  • 首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    2023年5月23日晚,iQOO Neo8系列正式发布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro强悍登场,限时售价3099元起;价位段最强性能手机iQOO Neo8同期上市
Top