您的位置:首页 > 编程语言 > Python开发

Python基础(八)装饰器

2016-06-01 00:11 357 查看

    今天我们来介绍一下可以提升python代码逼格的东西——装饰器。在学习装饰器之前我们先来复习一下函数的几个小点,方便更好的理解装饰器的含义。

 一、知识点复习

     1, 在函数中f1和f1()有什么不同,f1:表示的是将整个函数看作一个整体;f1():表示执行f1函数,下面通过一个例子来看一下:

 

    2、lambda函数:

 

    3、Python的从上到下的执行方式:

 

二、装饰器

      下面通过一个需求来介绍装饰器在代码中的应用和如何提高代码逼格,需求如下:

 B市某创业公司有N个业务部门,1个基础平台部门,基础平台负责提供底层的功能,如:数据库操作、redis调用、监控API等功能。业务部门使用基础功能时,只需要调用基础平台提供的功能即可。具体情况如下:

 

 

    目前公司有条不紊的进行着,但是,以前基础平台的开发人员在写底层代码时没有关注验证相关的问题,即:基础平台的提供的功能可能被任何人使用。现在需要对基础平台的所有功能进行重构,为平台提供的所有功能添加验证机制,即:执行功能前,先进行验证。

 现在老大把工作交给了小明,他是这么做的:

 

  当天小明就被开除了,老大语重心长的说回去好好学学Python吧。

 老大又把活交给小明2号 ,小明2号比小明要聪明一点,心想傻X才会一个部门一个部门去找呢,于是重构了基础平台的代码,代码如下:

 

  就这样小明2号修改了一周交差了,然而命运总是这么爱捉弄人,几个部门开会说加验证太麻烦,要去掉,又交给了小明2号,这次老大给了排期,一天之内做完,小明2号懵逼了,跟老大说完不成,于是老大去看了小明2号的修改的代码,然后就没有然后了,小明2号也光荣的退出了历史舞台。

 经过两次以后,老大已经下定决心要招个牛逼的Python开发,广发英雄帖请来了小明3号,将上面的工作交给了他,下面来看看小明3号是如何修改的:

 

修改完以后,老大看完代码很欣慰,对小明3号说:

    写代码要遵循开发封闭的原则,虽然在这个原则是用在面向对象开发,但是也适用于函数式编程,简单来说,规定已经实现的功能代码不允许被修改,但可以被扩展,即:

    ⊙封闭:已经实现的功能代码块

    ⊙开放:对扩展开放

如果将开放封闭原则应用在上述需求中,那么就不允许在函数f1、f2、f3的内部进行修改代码,老大说现在给你一个举个例子:

 

 

上述代码,也是仅仅对基础平台代码进行修改,就可以实现在其他人调用函数f1、f2、f3之前都进行[验证]操作,并且其他业务部门无需做任何操作。

    小明3号有点疑惑的问,这段代码的内部执行原理是什么呢?

老大说想知道,晚上洗干净等着我,这时小明3号菊花一紧,我X,老大还有这癖好,老大:逗你的,实际内部实现很简单,下面给你讲一下:

    单独以f1为例:

 

  

 当写完这段代码后(函数未被执行),Python解释器会从上到下解释代码,步骤如下:

        1,def outer(func):     将outer函数加载到内存

        2,@outer                  调用装饰器

 从表面上看解释器仅仅会解释两句代码,因为函数在没有被调用之前其内部代码不会被执行,但是

@outer这句代码里却大有文章。

@函数名是Python的一种语法糖:  

1,执行outer函数并将@outer下面的函数作为outer函数的参数,即:@outer 就等价于outer(f1)。

2,将执行完的outer函数返回值赋值给@outer下面的函数的函数名。

 

这样一来,以后业务部门想要执行f1函数时,就会执行新f1函数,在新f1函数内部先验证在执行原来的f1函数,再将原来f1函数的返回值返回给业务调用者。

 老大:回去好好研究一下吧,不懂洗干净晚上来我家。。。。

 三、装饰器参数

      1、被装饰的函数有参数

 

      2、一个函数被多个装饰器装饰

 ​   3、双重装饰器

 

 





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: