Python学习--装饰器

来源:互联网 发布:淘宝店铺装修设计教程 编辑:程序博客网 时间:2024/06/05 11:28


Python 装饰器

        Python的装饰器类似于生活中的装饰概念,即给原来的物体起到装饰作用,使具有其外形优美,用户体验更好等优点,或者进一步扩展原来物体的功能,使其更加完美。编程语言最重要的是实现功能,即需要类和方法,起本质归结为函数。为了能够更好地扩展函数的功能,Python引入了装饰器机制-----将函数对象进行装饰,增加函数的功能,使其功能更加完美。
        在Python语言中,一切都是对象,函数名也不例外。函数名是一个函数的标签或者称为一个对象,能够像函数的位置参数和命名参数一样被传入另一个函数中。如下图所示:函数printa()和printb()都是对象,并且可以通过参数的形式传递给PrintAorB()函数调用。Python的装饰器就是利用了函数的这点。





        理解Python的装饰器机制仍然需要理解另外一点:函数的返回值可以是函数标签或者称函数对象。跟前面介绍的类似,既然函数名可以作为变量传入某个函数,那函数名可不可以作为某个函数的返回值呢?答案显然是可以的。如下图所示:



        图中的tobedecorated()函数为需要利用Python装饰器机制进行功能拓展的函数,其基本功能是输出字符串:“This part is decorated by function decorator”,希望扩展其基本功能使其能够输出两行字符串:“This part is a decorator”和“This part is decorated by function decorator”。
        在函数decorator()内新建立了一个内建函数corepart(),该内建函数在每一次调用decorater()时被重新创建一次,为了能够在decorator()函数外部继续使用该corepart()函数,需要将该函数返回。通过调用decorator(tobedecorated)可以知道,返回的是函数对象corepart。然后利用decorator(tobedecorated)()即可以调用内建函数corepart()。为了更加形象地表述,可以先将返回的函数对象corepart赋值给变量newthing,然后通过newthing()来调用内建函数。并将tobedecorated()函数名对象赋值给oldthing,并通过其进行调用。两者的结果的比较如上图所示,即实现了将tobedecoreated()函数的输出单行字符串功能拓展为输出两行字符串的功能。

         最后,Python为了能够更优美的表述装饰器,引入了@符号(语法糖),该符号的意义即对函数进行某种类型的装饰。基本效果如下图所示。



         如上图所示,被装饰部分函数缺少上面的‘#’包围字符串“This part is to be decorated by decorator()”,为了装饰该函数的输出,使得其输出更加好看,即在"This..."字符串的上方也增加输出一行‘#’来装饰该函数的输出。
         值得注意的是,corepart函数的参数采用的可以输入任何形式和任意个数的参数形式,该用法可以有助于我们装饰各种各这样的函数。

0 0
原创粉丝点击