pyhton 装饰器 执行顺序

python装饰器

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


#-*-coding=utf-8-*-
import logging


def get_parameter(func):
    print "IN GET PARAMETER"

    def new_func():
        print "inside new func"
        return func()

    print "END GET PARAMETER"
    return new_func


@get_parameter
def 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 wrapper

def add_header(func):
    def wrapper():
        return "<header>" +func()+ '</header>'
    return wrapper

@add_header
@add_br
def sayHelloWorld():
    return "Hello world!"


def deco1(func):
    def wrapper(arg1,arg2):
        print "Start"
        func(arg1,arg2)
        print "End"
    return wrapper

@deco1
def 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_args
def 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里面的函数。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值