为什么我不能在对象内部创建对象属性?

时间:2019-11-08 11:11:09

标签: python object decorator

为什么我必须输入这个

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

不是吗?

2 个答案:

答案 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()