'@'符号用作函数修饰符是python2.4新增加的功能,修饰符必须出现在函数定义前一行,不允许和函数定义在同一行。
也就是说 @A def f(): 是非法的。 只可以在模块或类定义层内对函数进行修饰,不允许修修饰一个类。
一个修饰符就是一个函数,它将被修饰的函数做为参数,并返回修饰后的同名函数或其它可调用的东西。
#!/usr/bin/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) #根据输出结果可以看出