Удалить объект класса со всеми его ссылками

#python #object #oop #memory

Вопрос:

У меня есть класс, который принимает текстовый файл в качестве входных данных. Когда я предоставляю определенные входные данные, я хочу удалить все экземпляры объекта и создать новый экземпляр. Эти входные данные означают, что файл конфигурации обновлен и приложение необходимо запустить снова. Это то, что у меня было до сих пор.

 def main():   _config_path = sys.argv[1] if len(sys.argv) gt; 1 else ""  app = Application(_config_path)  is_brk = False  while True:  query = input()  if query.startswith('__'):  is_brk = True  break  # do_action() #This does some action  if is_brk:  # this does not work as some of objects in Application are singleton and not got   # deleted.  # this is what I've tried  del app  import gc  gc.collect()  main() # this  

Ошибка, которую я получаю, заключается в следующем: 2021-10-26 06:04:53,981 __init__ ERROR Error in Application __init__(): An instance has already been created. Creation of second instance of singleton class MySingletonClass is not allowed

Есть какие-либо предложения, что можно сделать в этом сценарии?

Комментарии:

1. Почему вы рекурсивно называете main? Похоже, что было бы более разумно поместить создание приложения в другой цикл за пределами входного цикла.

2. может быть, сначала получить query и проверить его — а потом создать Application только один раз. ИЛИ проверьте, есть ли Application метод для замены path без повторного создания Application

3. Приложение @furas принимает config файл в качестве входных данных. А затем разрешить пользователю выполнять несколько запросов. Но если пользователь внес определенные изменения config , я хочу, чтобы пользователь перезапустил приложение с помощью определенных специальных query

4. Я не знаю, что у вас внутри Application , но обычно в этом не было бы необходимости del , и gc.collect() поэтому лучше показать, что внутри Application . Ваша проблема в том, что он использует MySingletonClass . Лучше создайте в Application функции, которая может получить новую конфигурацию без Application повторного создания. Если вы используете config_path in __init__ для установки значений, переместите его в отдельную функцию — т. е. reset() — и запустите эту функцию в _init__` И тогда вы могли бы использовать app.reset() его снова, чтобы изменить его, не создавая Application снова.