python装饰器
刚接触python的装饰器,一头雾水。我不知道那是什么意思。忘了多少遍Debug,查了资料,才开始一点点明白。
后面会和大家一起把迷你银行的存取款功能以代码的形式实现,然后通过引入装饰器一步步优化代码。
废话不多说,梦想着开始码字了。我们在ATM存取款的过程用代码表示如下(不是很准确,只是为了掩饰需要)
上面是按下按钮1就存款,否则则取款。
不,你需要输入你的存取款密码! ! !所以,我们要添加一个密码来验证代码。
可以看出,虽然实现了密码验证功能,但是代码冗余度比较高,现在只模拟取款和存款功能,但是还有查询功能,转账功能等,所以冗余度更高,并且相对于取款和存款函数,复用性没有那么高,所以我们需要进一步优化代码,将验证函数写在取款和存款函数里面。
有没有办法在不改变原函数和原函数调用的情况下,扩展原函数的功能呢?当然有,这就是python中大名鼎鼎的装饰器。或者用上面的代码来演示
从现在开始,上图红框内的代码,即使被杀也不会改变。下面我们来实现带密码验证的存取款功能。
装饰器装饰有参函数
看下面这段代码
大家看看这段代码有没有什么问题?
运行结果
可以看到错误的原因,inner()函数多了一个参数。大家一定要注意,因为装饰器函数的返回值是inner,也就是说myprint现在等同于inner。
我们来改一下代码
为了让装饰器能够装饰更多的功能,我们进一步优化了代码。
装饰器装饰有返回值函数
从图中可以看出,无论修饰函数是否有返回值,结果都是没有返回值的。原因其实很简单,因为inner()函数根本就没有返回值。为了实现一个有返回值的函数在被装饰后仍然有返回值,内层函数需要和被装饰函数的返回值保持一致。
可以看出,有返回值的函数装饰后还是有返回值的,而没有返回值的函数装饰后没有返回值,这才符合我们想要的结果。
双重语法糖
为了更直观地演示双重语法糖,我不再使用上面的例子。
我先来定义一个函数
现在我有一个需求,想在'python小白盟'上面打印一行'='和一行'*',就是实现这个效果。
那么应该怎么写呢?大家可能会想到句法糖的叠加,下面哪一种是叠加的方式?
我们来运行一下就知道了
可见叠加法应该是第一个,也就是说最外层的语法糖先执行。
带参数的语法糖
为了演示带参数的语法糖,我将上图下移
很明显,红框中的代码冗余度比较高,我们可以使用带参数的语法糖来简化。
python学习网,大量的免费
,欢迎在线学习!
本文转自:https://www.jianshu.com/p/ec95c4ca3d39
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python如何提取文本信息?10/24
- ♥ 如何计算python中矩阵的行数?08/28
- ♥ python如何识别二维码?10/25
- ♥ python中的10061错误是什么11/25
- ♥ python中无法引入pil的问题如何解决10/28
- ♥ Anaconda 安装错误:无法创建 Anaconda 菜单08/22
内容反馈