python中装饰器的本质是什么

这篇文章将为大家详细讲解有关python中装饰器的本质是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

创新互联2013年开创至今,是专业互联网技术服务公司,拥有项目成都网站制作、成都做网站网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元阿鲁科尔沁做网站,已为上家服务,为阿鲁科尔沁各地企业和个人服务,联系电话:028-86922220

很多人把装饰器搞的很复杂,其实本质很简单.

首先,什么是装饰器呢?在代码中发现戴着@xxx帽子的,就是装饰器.

那要怎么自己定义一个装饰器呢?

其实任何一个接收一个参数的callable都可以用来做装饰器,比如函数和类.为方便起见,下面的例子都用函数来说明.

def deco(func):return 1

这里,deco就可以做装饰器.

@deco
def f(args):pass

"戴帽"其实就是调用,帽子戴在谁(一个函数定义)头上,就表示将谁作参数来调用,然后赋给一个同名变量.

上面的例子等价于f = deco(f).结果是函数f变成了1.

当然,我们用装饰器可不是用来返回1的.我们主要目的是"保持原有函数功能,增加额外功能".

那我们就定义一个装饰器"接收一个函数作参数并返回一个函数".

def deco(func): return func

这样我们可以在return func之前加代码做手脚增强功能,但是如果还需要在执行func后做手脚呢?还需要捕获func的参数args做手脚呢?于是我们用另外一个函数来包装.

得益于"函数是一等公民",我们可以在函数里面定义函数.这就是装饰器最常用的定义形式,形式如下

def deco(func):
    def newfunc(*args, **kwargs): 
        func(*args, **kwargs)
    return newfunc

其中*args, **kwargs用来捕获参数.

我们要在函数执行前后输出信息,只需要

def deco(func):
    def newfunc(*args, **kwargs):
        print 'before'
        ret = func(*args, **kwargs)
        print 'after'
        return ret
    return newfunc

理解了本质后,什么乱七八糟的"不带参数的装饰器"/"带参数的装饰器"/"函数装饰器"/"类装饰器"/"多个装饰器"/"为什么@route能自动收集url"等等等等都是表象了.

带参数的装饰器?

你把它当作一个函数调用就行了

关于python中装饰器的本质是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


当前名称:python中装饰器的本质是什么
链接分享:http://myzitong.com/article/jjciso.html