#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
снова.