python 元编程之装饰器

发布于 / python / 0 条评论

之前看元编程的时候,一直不太理解是怎么回事。

这几天回过头再来看,发现好像有点眉目了,故记录一下。

借用书中的一句话 元编程将程序当做数据,或在运行期完成编译期的工作。目前对前半句一知半解,对后半句稍有些理解了。

能够让程序在运行期完成编译期的工作,这让我想到一个东西—–装饰器  装饰器是什么?装饰器是在不改变原有代码结构的基础上给其增加其他功能,就如名字所言,装饰之用。

为什么说装饰器能够完成在程序运行期完成编译期的工作。请看下面这段代码

执行的结果为:

由此可以看出装饰器在加载模块时立即执行,但是被装饰的函数(本例中的test())是按正常的顺序执行。

装饰器的这种执行顺序是不是很像预编译呢?


装饰器是怎么实现的。装饰器是由闭包加上语法糖实现的。闭包说的是函数书写的风格。

为了理解闭包。看如下代码:

上述代码可以看出,在外层函数adder执行完后,它的参数x并没有被释放,并且和内层函数 wrapper一同存在着。这种 内层函数使用外层函数的变量,且外层函数返回内层的函数对象是形式就称为闭包。 为什么要这么费力的形成这种形式。还是看上述代码。因为adder返回的是一个函数对象,所以此时的 adder5 是一个函数对象,换言之要使用它只需要给它放入参数就可以。如上所示 adder5(5)、adder5(10)。它们都将返回输入的参数加上5后的值。并且发现每使用一次adder5这个函数对象,它的id都不一样。

闭包避免了使用全局变量,此外,闭包允许将函数与其所操作的某些数据(环境)关连起来。这一点与面向对象编程是非常类似的,在面对象编程中,对象允许我们将某些数据(对象的属性)与一个或者多个方法相关联。当对象中只有一个方法时,这时使用闭包是更好的选择。

现在反过头来看看装饰器是不是很像闭包的,外函数返回内层函数的函数对象。

语法糖就是上述形如 @log  的形式。它其实是等于 log(test),括号中就是被其装饰的函数对象。所以根据闭包和装饰器我们就能够实现python中的一大神器 —- 装饰器。

装饰器的形式还远不止于此,之后学懂了再记录吧。。

 

转载原创文章请注明,转载自: adaptの小站 » python 元编程之装饰器

Not Comment Found