python decorator的本质
推荐查看博客:python的修饰器
对于Python的这个@注解语法糖- Syntactic Sugar 来说,当你在用某个@decorator来修饰某个函数func时,如下所示:
@decorator def func(): pass
其解释器会解释成下面这样的语句:
func = decorator(func)
是的,上面这句话在真实情况下执行了。如果我们执行以下代码:
def fuck(fn): print "fuck %s!" % fn.__name__[::-1].upper() @fuck def wfg(): print 'abc'
输出:
fuck GFW!
所以一般我们写修饰器,都是写一个二级函数,返回一个函数。例如下面代码:
def hello(fn): def wrapper(): print "hello, %s" % fn.__name__ fn() print "goodby, %s" % fn.__name__ return wrapper @hello def foo(): print "i am foo" foo()
输出:
hello, foo
i am foo
goodby, foo
相当于执行
foo=hello(foo)
foo()