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

Python装饰器演化过程

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

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

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

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

场景

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

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

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

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

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

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

函数名字是变量名而已

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

mystr = 'xxxx'

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

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

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

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

NameError: name 'mysum' is not defined

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

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

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

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

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

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

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

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

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

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

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

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

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

函数传递

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • MIX Fold3包装盒泄露 新机本月登场

    MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • Redmi Pad评测:红米充满野心的一次尝试

    Redmi Pad评测:红米充满野心的一次尝试

    从Note系列到K系列,从蓝牙耳机到笔记本电脑,红米不知不觉之间也已经形成了自己颇有竞争力的产品体系,在中端和次旗舰市场上甚至要比小米新机的表现来得更好,正所谓“大丈夫生居
  • JavaScript 混淆及反混淆代码工具

    JavaScript 混淆及反混淆代码工具

    介绍在我们开始学习反混淆之前,我们首先要了解一下代码混淆。如果不了解代码是如何混淆的,我们可能无法成功对代码进行反混淆,尤其是使用自定义混淆器对其进行混淆时。什么是混
  • K6:面向开发人员的现代负载测试工具

    K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • 摸鱼心法第一章——和配置文件说拜拜

    摸鱼心法第一章——和配置文件说拜拜

    为了能摸鱼我们团队做了容器化,但是带来的问题是服务配置文件很麻烦,然后大家在群里进行了“亲切友好”的沟通图片图片图片图片对比就对比,简单对比下独立配置中心和k8s作为配
  • 之家push系统迭代之路

    之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为“纯欲天花板”的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 四年持续更迭坚持探索行业无人之境,HarmonyOS 4带来五大升级多项创新

    四年持续更迭坚持探索行业无人之境,HarmonyOS 4带来五大升级多项创新

    除了华为每年新发布的旗舰手机系列,上亿花粉更加期待鸿蒙系统每次的跨版本大更新。8月4日,HarmonyOS 4于HDC 2023正式发布,这也是该系统历经四年的再
  • 质感不错!OPPO K11渲染图曝光:旗舰IMX890传感器首次下放

    质感不错!OPPO K11渲染图曝光:旗舰IMX890传感器首次下放

    一直以来,OPPO K系列机型都保持着较为均衡的产品体验,历来都是2K价位的明星机型,去年推出的OPPO K10和OPPO K10 Pro两款机型凭借各自的出色配置,堪称有
Top