Python装饰器翻译慕课网

来源:互联网 发布:java 编码 编辑:程序博客网 时间:2024/05/20 01:45
def dec(func):
    def in_dec(*arg):
        print('in dec arg',arg)
        if len(arg) == 0:
            return 0
        for val in arg:
            if not isinstance(val,int):
                return 0
        return func(*arg)
    return in_dec


@dec                                  1
def my_sum(*arg):
    print('in my_sum')
    return sum(arg)

print(my_sum(1,2,3,4,5))       2

分析:函数不用全执行,1调用deco,参数为被装饰的函数my_sum。调用哪里执行哪里。1.从1开始执行,调用dec函数,func=my_sum并把值返回给my_sum即my_sum=in_dec。跳过闭包(闭包为函数,不调用不执行。只有调用才执行),其它没有调用不用执。当执行2时,由1中,my_sum=in_dec调用in_dec,返回值中调用my_sum(由1可知)。


又如这个例子说明,闭包为函数,只有调用才去执行。1执行函数调用deco,跳过闭包,执行语句输出call deco。其它为准备工作。

def deco(func):

    def in_deco():
        print('in deco')
        func()
    print('call deco')


@deco           1
def bar():
    print('in bar')


进一步解释:

def deco(func):
    def in_deco():
        print('in deco')
        func()
    print('call deco')
    return in_deco


@deco               1
def bar():
    print('in bar')
bar()                     2

1.调用deco,func=bar,继续执行该函数中语句(除去闭包)输出call deco,返回in_deco给bar,即bar=in_deco就到2了

2.调用bar,由1得到bar=in_deco,调用in_deco函数,输出in deco,继续执行该函数中语句,调用fun函数,由1fun=bar调用bar输出in bar。

进一步解释参数调用

def deco(func):
    def in_deco(x,y):
        print('in deco')
        func(x,y)
    print('call deco')
    return in_deco


@deco
def bar(x,y):
    print('in bar',x+y)
bar(1,2)
如果想给bar传达参数,因为bar是in_deco返回的所有给in_deco加参数,同样fun调用,所有给fun添加参数。