为什么我必须输入这个
def call_once(f):
def wrapper(*args):
if wrapper.flag == False:
wrapper.flag = True
return f(*args)
wrapper.flag=False
return wrapper
不仅仅是这个
def call_once(f):
def wrapper(*args):
if wrapper.flag == False:
wrapper.flag = True
return f(*args)
else:
wrapper.flag=False
return wrapper
不是吗?
答案 0 :(得分:1)
从逻辑上进行思考:第一次调用wrapper
时会发生什么?
if wrapper.flag == False:
这行不通,因为尚未为wrapper.flag
赋予值,因此无法进行比较。
第一个版本有效是因为wrapper.flag=False
发生在调用wrapper
之前。
答案 1 :(得分:0)
首先检查包装器是否具有标志属性。如果没有,则尚未调用。
def call_once(f):
def wrapper(*args):
if not hasattr(wrapper, "flag"):
wrapper.flag = True
return f(*args)
return wrapper
@call_once
def test():
print("test")
for i in range(0, 5):
test()