2017-02-07 62 views
0

我想在python 3中编写一个装饰器,它基本上保留了一个函数被调用的次数。 这里是我的代码:python调用序列中的装饰器

def call_counter(func): 
    def helper(x): 
     helper.calls += 1 
     return func(x) 

    helper.calls = 0 

    return helper 


@call_counter 
def succ(x): 
    return x + 1 

for i in range(10): 
    print(succ(i)) # <--- ?? 

我知道如何装饰作品,但只有我这里有困惑的是,第一次打电话SUCC(X)得到一个函数的回报@call_counter装饰。 但是,这里的主要困惑是我不太明白for循环内部的顺序调用是如何发生的?

那么从第一次调用返回函数(在这种情况下是否为辅助函数)后,流如何去呢?

现在在for循环中,succ(0),succ(1)等被调用,这是如何工作的?我们是否重用与第一次调用相同的返回函数,或者每次将for循环添加1时都会调用装饰器?

回答

1

修饰符只在满足时应用一次,之后所有调用succ都使用您返回的相同功能helper

,如果你只是打印for循环,而不是调用它里面的函数对象由此可以看出:

for i in range(10): 
    print(succ) 
<function call_counter.<locals>.helper at 0x7fe4d05139d8> 
<function call_counter.<locals>.helper at 0x7fe4d05139d8> 
# ... so on, ten times. 

的流量直线前进,helper的每一次调用的参数x这传递给func

+0

值得一提的是,如果你想让你的装饰透明,你可以使用'functools.wraps'。 – khachik

+0

感谢吉姆,但我想你的意思是把印刷(succ)放在succ()里面而不是在for循环里面?但我明白你的观点。 – skyrocker