Python 中的函数和 Java、C++不太一样,Python 中的函数可以像普通变量一样当做参数传递给另外一个函数,例如:
def foo():
print("foo")
def bar(func):
func()
bar(foo)
装饰器本质上是一个 Python 函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景,装饰器是解决这类问题的绝佳设计。有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码到装饰器中并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
def outer(f):
print ('some message com from outer function')
def inner(*arg):
print ('before function')
f(3, 6)
print ('after function')
return inner
@outer
def func(a, b):
print (func.__name__)
print ('a = %s, b = %s' % (a, b))
if __name__=='__main__':
print ('start')
func()
print ('end')
some message com from outer function
after function
start
before function
inner
a = 3, b = 6
end
整段代码的执行流程:
整个模块加载完毕,解释器将代码装换为语法树,解释器对 @ 进行解释时,实际上执行:
-
func = outer(func) #根据输出结果可以看出
-
执行__name__=='__main__' 打印出 start
-
因为解释器对函数func进行了解释,所以可以用打印出func.__name看到func 变成了 inner 函数,其实在if __name__执行func()的时候,是在执行上面outer里面的inner函数
-
执行__name__=='__main__' 打印出 stop