首页 > 代码库 > python装饰器的本质
python装饰器的本质
很多人把装饰器搞的很复杂,其实本质很简单.
首先,什么是装饰器呢?在代码中发现戴着@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装饰器的本质
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。