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