知行编程网知行编程网  2022-12-04 06:00 知行编程网 隐藏边栏  0 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于看了这篇Python装饰器详解,还不会的话我也没辙了的相关知识,希望可以帮到处于编程学习途中的小伙伴


看完这篇Python装饰器详解,不知道怎么做就无能为力了


python装饰器

刚接触python的装饰器,一头雾水。我不知道那是什么意思。忘了多少遍Debug,查了资料,才开始一点点明白。

看完这篇Python装饰器详解,不知道怎么做就无能为力了

后面会和大家一起把迷你银行的存取款功能以代码的形式实现,然后通过引入装饰器一步步优化代码。

废话不多说,梦想着开始码字了。我们在ATM存取款的过程用代码表示如下(不是很准确,只是为了掩饰需要)

看完这篇Python装饰器详解,不知道怎么做就无能为力了

看完这篇Python装饰器详解,不知道怎么做就无能为力了

上面是按下按钮1就存款,否则则取款。

不,你需要输入你的存取款密码! ! !所以,我们要添加一个密码来验证代码。

看完这篇Python装饰器详解,不知道怎么做就无能为力了

可以看出,虽然实现了密码验证功能,但是代码冗余度比较高,现在只模拟取款和存款功能,但是还有查询功能,转账功能等,所以冗余度更高,并且相对于取款和存款函数,复用性没有那么高,所以我们需要进一步优化代码,将验证函数写在取款和存款函数里面。

看完这篇Python装饰器详解,不知道怎么做就无能为力了

看完这篇Python装饰器详解,不知道怎么做就无能为力了

有没有办法在不改变原函数和原函数调用的情况下,扩展原函数的功能呢?当然有,这就是python中大名鼎鼎的装饰器。或者用上面的代码来演示

看完这篇Python装饰器详解,不知道怎么做就无能为力了

从现在开始,上图红框内的代码,即使被杀也不会改变。下面我们来实现带密码验证的存取款功能。

看完这篇Python装饰器详解,不知道怎么做就无能为力了

看完这篇Python装饰器详解,不知道怎么做就无能为力了


装饰器装饰有参函数

看下面这段代码

看完这篇Python装饰器详解,不知道怎么做就无能为力了

大家看看这段代码有没有什么问题?

运行结果

看完这篇Python装饰器详解,不知道怎么做就无能为力了

可以看到错误的原因,inner()函数多了一个参数。大家一定要注意,因为装饰器函数的返回值是inner,也就是说myprint现在等同于inner。

我们来改一下代码

看完这篇Python装饰器详解,不知道怎么做就无能为力了

为了让装饰器能够装饰更多的功能,我们进一步优化了代码。

看完这篇Python装饰器详解,不知道怎么做就无能为力了

装饰器装饰有返回值函数

看完这篇Python装饰器详解,不知道怎么做就无能为力了

从图中可以看出,无论修饰函数是否有返回值,结果都是没有返回值的。原因其实很简单,因为inner()函数根本就没有返回值。为了实现一个有返回值的函数在被装饰后仍然有返回值,内层函数需要和被装饰函数的返回值保持一致。

看完这篇Python装饰器详解,不知道怎么做就无能为力了

可以看出,有返回值的函数装饰后还是有返回值的,而没有返回值的函数装饰后没有返回值,这才符合我们想要的结果。


双重语法糖

为了更直观地演示双重语法糖,我不再使用上面的例子。

我先来定义一个函数

看完这篇Python装饰器详解,不知道怎么做就无能为力了

现在我有一个需求,想在'python小白盟'上面打印一行'='和一行'*',就是实现这个效果。

看完这篇Python装饰器详解,不知道怎么做就无能为力了

那么应该怎么写呢?大家可能会想到句法糖的叠加,下面哪一种是叠加的方式?

看完这篇Python装饰器详解,不知道怎么做就无能为力了

看完这篇Python装饰器详解,不知道怎么做就无能为力了

我们来运行一下就知道了

看完这篇Python装饰器详解,不知道怎么做就无能为力了

可见叠加法应该是第一个,也就是说最外层的语法糖先执行。


带参数的语法糖

为了演示带参数的语法糖,我将上图下移

看完这篇Python装饰器详解,不知道怎么做就无能为力了

很明显,红框中的代码冗余度比较高,我们可以使用带参数的语法糖来简化。

看完这篇Python装饰器详解,不知道怎么做就无能为力了

python学习网,大量的免费
,欢迎在线学习!

本文转自:https://www.jianshu.com/p/ec95c4ca3d39

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享