Почему я не могу создать атрибут объекта внутри объекта? - PullRequest
0 голосов
/ 08 ноября 2019

Почему я должен набрать это

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 ]

1 голос
/ 08 ноября 2019

Продумайте это логически: что происходит при первом вызове wrapper?

if wrapper.flag == False:

Это не может работать, потому что wrapper.flag еще не присвоено значение, поэтому нет сравнениядолжно быть сделано.

Первая версия работает, потому что wrapper.flag=False происходит до вызова wrapper.

0 голосов
/ 08 ноября 2019

Проверьте, имеет ли ваша обертка атрибут flag первым. Если это не так, он еще не был вызван.

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()
...