美文网首页柠檬班软件测试
学了这么久什么是python装饰器都不知道,这篇要看看了!

学了这么久什么是python装饰器都不知道,这篇要看看了!

作者: 0fdd04f992cd | 来源:发表于2019-03-20 15:12 被阅读1次

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    如下所示:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    小白的故事听完了,关于装饰器你理解了吗?有问题欢迎在下面提问。


    相关文章

      网友评论

        本文标题:学了这么久什么是python装饰器都不知道,这篇要看看了!

        本文链接:https://www.haomeiwen.com/subject/hwxzmqtx.html