python中的装饰器,是对“高阶函数”的一种延生。使用它能够对函数进行加强,这样的方式就好像是OOP中的“装饰”设计模式所体现出来的效果同样。
python
1,简单装饰器设计模式
先来看一个高阶函数的例子,哈,回顾一下
app
而后,把函数“now”用函数“log”给装饰一下,就像是这样子:
函数
经过在函数定义时,使用“@fn”来装饰该函数,这就是python中的装饰器。
spa
通过上面的例子,同时咱们也能获得这么一个结论就是:@log == log(now) 设计
这个,就是python装饰器最本质的东西!orm
因而,上面的例子,当咱们直接调用“now”函数的时候就会变成这样:
it
那在调用函数“now”的时候,同时打印出了一条“log”信息,这样就加强了“now”的功能,这种就称为是:装饰器!方法
2,带参装饰器im
那如今,若是你准备在调用装饰器的时候,同时能够传递一些参数,又该怎么作呢?
首先,仍是要从高阶函数的角度来看,因此,能够模拟成这样子:
那上面高阶函数的写法,转换成装饰器,就应该是这样子:
而后,我么就能够直接调用函数“now”:
那这样,是否是就实现了一个带参数的装饰器呢?
其实,只要明白一点,装饰器其实也很好理解。
咱们在函数“now”上,经过增长“@log”,其实就是说:在调用“now”以前,先把“now”当作参数传递到“log”方法中执行一次。而后,因为,咱们后续还须要再次调用“now”,因此,传递到“log”内部的“now”必须还得再返回,那这样的一个过程,就是装饰器的“执行”过程!
3,正规的写法
上面实现的装饰器,在装饰器的内部咱们直接返回了外部的那个“now”函数,那么当咱们在外部手动调用“now”函数的时候就会出现函数的返回值变成了它自己,因此咱们应该在装饰器的内部,显式的调用一下“now”函数,而且返回它的返回值!
首先,咱们针对不带参的装饰器作一个改造。
改造的过程是这样:当咱们调用装饰函数“log”的时候,它再也不是直接执行,而是在其内部又定义了一个函数,而后返回这个函数。那这个过程等价于这样: @log => now = log(now);
如今,“now”函数虽然存在,可是其实它自己已经指向了不一样的一个函数“wrapper”。而后当你调用这个全新的“now”的时候,其实调用的时候内部的“wrapper”函数,而后该函数打印出对应的信息,同时还调用了“最开始的那个now函数”,为了可以调用这个“最开始的now 方法”,因此须要在“wrapper”函数中去显式的调用,同时还要返回它的值,由于这个原本就是“now”方法要返回的内容!
固然,对于带参的装饰器,就能够对应的这么写:
带参数的装饰器,对于不带参的而言,只是须要再经过一层函数来包装一下而言。
备注:必定要认真理解,理解透彻,方成正道!
--------------------------------------------------------华丽的分割线------------------------------------------------
买了本书,应该也快到了 ^_^