Python装饰器演化过程
创始人
2025-07-08 16:00:58
0

Python 的装饰器可能是很多初学者难以搞懂的知识点之一,其实以前我也有讲解这方面的知识,不过那是在 pandas 专栏里面。

今天以另一个角度再次讲解装饰器。

场景

先看看一开始的代码:

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

比如 行10 执行后,后台会输出。

接下来,我们一步步实现 faker 函数。

函数名字是变量名而已

前面定义的函数 mysum ,只不过是一个普通变量。就像你用一个变量保存了一个字符串一样:

mystr = 'xxxx'

只不过函数是表达一段代码(逻辑)。怎么证明?

python 中可以用 del 关键字删除一个变量:

行12 会报错:

NameError: name 'mysum' is not defined

不怕,可以先用另一个变量"接住"函数对象:

行8:注意了,mysum 后面没有带括号。因为函数名 + 括号,才是执行函数体内的代码。只是写函数名字,实际上并没有执行函数。

好了,到此为止,下面是初始版本的 faker:

非常简单了,应该大家都能理解。不过现在 faker 一点都不像 mysum 呀!调用是这样子的:

而且参数 1 和 2 还固定写在了 faker 里面。

那么,先解决参数的问题吧,非常简单,设置两个参数就可以:

用上一开始的"变量假冒法" :

但 faker 函数里面仍然有一个固定的东西(行8),那个 other_func 变量永远指向 mysum 函数(行4)。我们希望 faker 函数可以假冒任意的函数。

函数传递

我们既然学会了"变量假冒法",那么就能知道,函数对象其实与普通的数据差不多,是可以通过参数传入另一个函数中。

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

但是显然,现在代码报错了,因为 faker 函数原来的两个变量 a 和 b 没有了。就算把 a 和 b 加上,也不行:

我们并不是要在行12那里执行函数。怎么办?

other_func 参数肯定是需要的,只是直接放在 faker 不行而已。那么就多搞一个函数吧:

胜利的曙光已经出现了。

上面 vs code 已经提示出两个错误。一个个来。

第一个问题,行16,我们希望 real_faker 调用后,返回 faker 函数本身。

简单:

可以看到 行16 没有提示错误了。

第二个问题,行12,找不着变量 other_func 。

简单,在函数 real_faker 中,不就有一个大大的参数 other_func 。把整个 faker 函数移进去就可以:

现在 real_faker 就是带有装饰器效果。不过,可以看到,每次我们要装饰一个函数,都必须写上 行17 的代码。

所以,python 提供了一个简化的语法。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...