今天的任务比较重,因为要一起学习Python中比较重要和难点的装饰器。我会和大家一起把迷你银行的存取款功能以代码的形式实现,然后通过引入装饰器一步步优化代码。废话不多说,梦想着开始码字了。我们去ATM存取款的过程用代码表示如下(不是很准确,只是为了掩饰需要)。以上是按1号键入金,否则出金。不,您需要输入您的存取款密码!!!所以,我们要添加一个密码来验证代码。可以看出,虽然实现了密码验证功能,但是代码冗余度比较高,现在只模拟取款和存款功能,但是还有查询功能,转账功能等,所以冗余度更高,并且相对于取款和存款函数,复用性没有那么高,所以我们需要进一步优化代码,将验证函数写在取款和存款函数里面。有没有办法在不改变原函数和原函数调用的情况下,扩展原函数的功能呢?当然有,这就是python中大名鼎鼎的装饰器。还是用上面的代码来演示一下,从现在开始,上面红框里的代码,就算杀了也不会改。让我们实现带密码验证的存取款功能。装饰器是用参数函数装饰的。看下面的代码。看看这段代码有没有问题?从运行结果可以看出错误的原因,inner()函数多了一个参数。大家一定要注意,因为装饰器函数的返回值是inner,也就是说myprint现在等同于inner。让我们更改代码。为了让装饰器能够装饰更多的功能,我们进一步优化了代码。装饰器用返回值装饰函数。从图中可以看出,无论修饰函数是否有返回值,结果都是没有返回值的。原因其实很简单,因为inner()函数根本就没有返回值。为了实现一个有返回值的函数在被装饰后仍然有返回值,内层函数需要和被装饰函数的返回值保持一致。可以看出,有返回值的函数装饰后还是有返回值的,而没有返回值的函数装饰后没有返回值,这才符合我们想要的结果。双语法糖为了更直观地演示双语法糖,我不再使用上面的例子。让我先定义一个函数。现在我有一个要求。我想在'python小白盟'上面打印一行'='和一行'*',就是为了达到这个效果。那么应该怎么写呢?大家可能会想到句法糖的叠加,下面哪一种是叠加的方式?我们运行一下,可以看到叠加的方法应该是第一个,也就是说最外层的语法糖先被执行。带参数的语法糖为了演示带参数的语法糖,我把上图搬了一遍。很明显,红框内的代码冗余度比较高。我们可以使用带参数的语法糖来简化装饰器。说了这么多,祝大家天天开心!
