深入理解python装饰器的装饰过程

版权声明:禁止转载至其它平台,转载至博客需带上此文链接。 https://blog.csdn.net/qq_41841569/article/details/88664607

最近有同学问在问关于python中装饰器的问题,说不太理解装饰器的装饰过程。

学习Python中有不明白推荐加入交流群
号:984632579
群里有志同道合的小伙伴,互帮互助,
群里有不错的视频学习教程和PDF!

那么在下面通过一个小白的故事,来给大家深入讲解一下装饰器的整个实现过程的。

01

开放封闭原则

讲装饰器之前我们首先来了解一下开放封闭原则,也是面向对象编程的核心原则。

**开放封闭原则:**软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。

**装饰器有什么作用:**装饰器可以在不更改原功能代码的情况下,可以扩展新的功能,正是对开放封闭原则的完美体现,这也就是我们为什么要学习装饰器了。

02

小白和装饰器的故事

小白是一个刚毕业的程序员,进公司的第一个月,就被分到了一个项目组中,负责一个功能的实现,如下:

img

小白战战兢兢连续加班一个月终于完成了功能的实现。

刚好到了十一周,等来了长假,可以好好休息了,小白开开心心的回去了。

第二天早上八点还没睡醒,就接到老大的电话,说客户要加新需求。

在原来实现的功能基础上加上一个身份校验的功能。

执行功能之前都必须要校验身份,上班之前就要完成。(小白此时心中一万只草泥马在奔腾,没办法,代码还是要写)

于是小白想了一下,花了2天时间,在自己的代码中加上了下面一段代码,然后发给了老大。

img

老大打开代码一看,立刻就火气上来了。

打电话给小白,问他知不知道什么是开放封闭原则?

小白一脸懵逼(心里真不懂)。

**老大给他解释道:**已经实现功能的代码就不要再更改了,可以扩展,你这个把之前实现好的功能代码全部改了,如果哪天客户又提需求说校验功能不要了,你是不是还要再全部改一遍?

小白想想觉得老大说的很有道理,又花了一天时间改好了代码,发给了老大。

img

老大拿到代码的一看,叹了口气,立刻打电话给小白,老大说你这个调用方式一改,其他同事负责的功能中,使用到你这三个功能的地方不是全部要改吗?

不过这一遍改的思路没错,你想想办法让调用方法不变就行了。

于是小白花了一天时间,想了想又写好了一份代码,发给了老大?

img

老大这次看到代码终于笑了。

又给小白打了个电话说:这次改的很不错,原来的功能代码没改,别的同事使用该功能的调用方法也没变。

不过还可以优化一下,通过装饰器写法可以让代码看起来更简洁。

让小白把func_1=func_check(func_1)这行代码删掉。

在原功能函数定义之前加上一句@func_check,就可以休息了。

如下所示:

03

基础的装饰器

img

虽然小白的代码在老大的指点下改好了。

但是小白还是有点懵逼,老大刚刚说的这个装饰器到底是个什么?

自己一点都不了解,小白为了搞懂这个装饰器,开始了他的学习。

在学习装饰器的过程中,小白总结了以下几个知识点:

img

04

带参数的装饰器

理解了上面的装饰器之后,小白开始思考更复杂的问题。

如果被装饰器的函数有参数那么改怎么办?

小白为了理解,研究了好久终于弄明白了,写出了下面一段代码实现了带参数的装饰器。

img

小白搞懂了带参数的装饰器之后,甚是开心。

又想了想装饰器有没有万能的写法,既可以装饰有参数的又可以装饰没参数的呢?

这个时候小白想到了函数中的不定长参数。

不定长参数可以传一个或者多个,也可以不传。

把装饰器中,传参数的地方改成不定长参数那不就可以实现了吗?

小白快速的改了代码,然后进行了运行代码进行测试。

05

通用装饰器

img

果然不出小白所料,通过不定长参数小白顺利的实现通用的装饰器。

好了,小白和装饰器的故事就讲到这里了。

猜你喜欢

转载自blog.csdn.net/qq_41841569/article/details/88664607