修饰器

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

整段代码的执行流程:

    整个模块加载完毕,解释器将代码装换为语法树,解释器对 @ 进行解释时,实际上执行:

  1. func = outer(func)    #根据输出结果可以看出

  2. 执行__name__=='__main__' 打印出 start

  3. 因为解释器对函数func进行了解释,所以可以用打印出func.__name看到func 变成了 inner 函数,其实在if __name__执行func()的时候,是在执行上面outer里面的inner函数

  4. 执行__name__=='__main__' 打印出 stop

  

猜你喜欢

转载自blog.csdn.net/Strive_0902/article/details/81590326