首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

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

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

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

1、开放封闭原则

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

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

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

2、小白和装饰器的故事

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

小白战战兢兢连续加班一个月终于完成了功能的实现。刚好到了十一周,等来了长假,可以好好休息了,小白开开心心的回去了。

第二天早上八点还没睡醒,就接到老大的电话,说客户要加新需求。在原来实现的功能基础上加上一个身份校验的功能。执行功能之前都必须要校验身份,上班之前就要完成。(小白此时心中一万只草泥马在奔腾,没办法,代码还是要写)

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

老大打开代码一看,立刻就火气上来了。打电话给小白,问他知不知道什么是开放封闭原则?

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

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

老大拿到代码的一看,叹了口气,立刻打电话给小白,老大说你这个调用方式一改,其他同事负责的功能中,使用到你这三个功能的地方不是全部要改吗?不过这一遍改的思路没错,你想想办法让调用方法不变就行了。

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

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

不过还可以优化一下,通过装饰器写法可以让代码看起来更简洁。让小白把func_1=func_check(func_1)这行代码删掉。在原功能函数定义之前加上一句@func_check,就可以休息了。

3、基础的装饰器

虽然小白的代码在老大的指点下改好了。但是小白还是有点懵逼,老大刚刚说的这个装饰器到底是个什么?自己一点都不了解,小白为了搞懂这个装饰器,开始了他的学习。

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

4、带参数的装饰器

理解了上面的装饰器之后,小白开始思考更复杂的问题。如果被装饰器的函数有参数那么改怎么办?小白为了理解,研究了好久终于弄明白了,写出了下面一段代码实现了带参数的装饰器。

小白搞懂了带参数的装饰器之后,甚是开心。又想了想装饰器有没有万能的写法,既可以装饰有参数的又可以装饰没参数的呢?这个时候小白想到了函数中的不定长参数。不定长参数可以传一个或者多个,也可以不传。

把装饰器中,传参数的地方改成不定长参数那不就可以实现了吗?小白快速的改了代码,然后进行了运行代码进行测试。

5、通用装饰器

果然不出小白所料,通过不定长参数小白顺利的实现通用的装饰器。好了,小白和装饰器的故事就讲到这里了。

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190319A0CMV700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券