pyhton 装饰器 执行顺序

来源:互联网 发布:企业数据库系统有哪些 编辑:程序博客网 时间:2024/05/22 17:35

python装饰器

请问下面的代码会输出什么的内容 ?


#-*-coding=utf-8-*-import loggingdef get_parameter(func):    print "IN GET PARAMETER"    def new_func():        print "inside new func"        return func()    print "END GET PARAMETER"    return new_func@get_parameterdef show_function():    print "SHOW Function"    return "HELLO"# a=show_function#a()#get_parameter()#a=show_function()#print a#演示2个装饰器同时使用def add_br(func):    #print '<br>',    def wrapper():        return '<br>'+func()+'</br>'    return wrapperdef add_header(func):    def wrapper():        return "<header>" +func()+ '</header>'    return wrapper@add_header@add_brdef sayHelloWorld():    return "Hello world!"def deco1(func):    def wrapper(arg1,arg2):        print "Start"        func(arg1,arg2)        print "End"    return wrapper@deco1def args_deco_test(x1,x2):    print "first args is %s . Second args is %s." %(x1,x2)def multi_args(func):    def wrapper(*args,**kwargs):        print "start"        func(*args,**kwargs)        print "end"    return wrapper@multi_argsdef deco_multi_arg(*args,**kwargs):    for i in args:        print "args : %s" %i    for k in kwargs:        print "key=" ,k        print 'value=',kwargs[k]    print "end in main"def deco_rocky(name):    print "deco_rocky: ",name    def sub_function(func):        print "sub function"        def wrapper(args1,args2):            print "in wrapper"            func(args1,args2)            print "end of wrapper"        return wrapper    return sub_function@deco_rocky("Dinesh")def foo_focky(arg1,arg2):    print "In foo_rocky"    print "arg1: ",arg1    print "arg2: ",arg2    print "End of foo_rocky"def main():    #print sayHelloWorld()    print "Morning"    #args_deco_test('one','two')    #deco_multi_arg('args1','args2','args3','args4',name="Rocky",sex="Female")    #foo_focky('HHH','Mars')if __name__ == "__main__":    main()





答案:


IN GET PARAMETER
END GET PARAMETER
deco_rocky:  Dinesh

Morning


为什么不执行任何语句,却把装饰器的部分函数给执行了呢?


只要因为装饰器的@语法糖


@get_parameter
这一句等效于

f=get_parameter(show_function)
这一句会执行get_parameter的里面的除wrapper的语句
而当 执行f()
的时候,就会执行wrapper里面的函数。



原创粉丝点击