Функция, которая что-то делает и вызывает встроенную функцию, которая это удаляет

Я создаю диспетчер задач и хочу использовать полную функцию, которая будет что-то делать с созданным экземпляром, а затем вызвать del и удалить созданный экземпляр объекта класса. Является ли это возможным? Я очень стараюсь найти решение.

Пытался использовать функцию из класса, пытался найти статьи на эту тему, но безуспешно.

from datetime import date

class reg_task:
    def __init__(self, what_to_do, date=date.today(), hour=None, tag=None, project="day to day task", priority=None, remind_time=None):
        self.what_to_do = what_to_do
        self.date = date
        self.hour = hour
        self.tag = tag
        self.project = project
        self.priority = priority
        self.remind_time = remind_time

    def __str__(self):
        return f'task {self.what_to_do}, to-do-date - {self.date}'

    def tasks_complete(self):
        with open(r"C:\Users\Avi Fenesh\Desktop\python\tasks_project\archive\archive", "a") as archive:
            archive.write(f"{str(self)} \n")
        del self

Проблема с tasks_complete(). Когда я вызываю функцию, она не удаляет созданный объект класса.


person Avi Fenesh    schedule 17.10.2019    source источник
comment
Есть ли где-нибудь другой контейнер, в котором хранятся экземпляры задач? Где вы пытаетесь удалить экземпляр из?   -  person Karl Knechtel    schedule 17.10.2019
comment
нет, я пробовал простой пример. сохранил экземпляр, а затем попытался немедленно удалить его.   -  person Avi Fenesh    schedule 17.10.2019
comment
Как узнать, что объект не был удален?   -  person martineau    schedule 17.10.2019
comment
Я пытаюсь снова позвонить ему в интерпретаторе   -  person Avi Fenesh    schedule 17.10.2019


Ответы (1)


Это потому, что объекты не могут быть собраны мусором, пока кто-то держит на них ссылку. Просто делать del self недостаточно.

См .: del self vs self .__ del __ () - и как правильно выполнять очистку в Python?

person hoodakaushal    schedule 17.10.2019
comment
так есть другой способ сделать это и убедиться, что экземпляр больше не существует? - person Avi Fenesh; 17.10.2019
comment
Экземпляр будет автоматически удален, если на него не будет ссылок. В общем, если у вас нет для этого очень конкретной причины, вы должны позволить сборке мусора обрабатывать такие вещи за вас. - person hoodakaushal; 17.10.2019
comment
но моя идея сразу удалить экземпляр. Я собираюсь использовать функцию, которая покажет все задачи, связанные с текущим днем, и я хочу, чтобы тот экземпляр, который я помечен как завершенный, не появлялся - person Avi Fenesh; 17.10.2019
comment
В этом случае было бы проще удалить задачу из любой структуры данных, которую вы используете для хранения задач, или пометить ее как завершенную или что-то в этом роде, чтобы при отображении задач вы ее не отображали. - person hoodakaushal; 17.10.2019
comment
Если вы выполните a = reg_task(), а затем экземпляр удалил себя, что вы ожидаете, что произойдет со следующим кодом, который пытается использовать a? - person Karl Knechtel; 18.10.2019