Метод __del__ в Python — как работает
В данном руководстве вы узнаете о специальном методе Python __del__ и поймете, как он работает.
Введение в метод Python __del__
В Python сборщик мусора управляет памятью автоматически. Сборщик мусора уничтожит объекты, на которые нет ссылок.
Если объект реализует метод __del__, Python вызывает этот метод непосредственно перед тем, как сборщик мусора уничтожит объект. Однако сборщик мусора определяет, когда следует уничтожить объект. Следовательно, он определяет, когда будет вызываться метод __del__.
__del__ иногда называют финализатором класса. Обратите внимание, что __del__ не является деструктором, поскольку объект уничтожает сборщик мусора, а не метод __del__.
Ловушки __del__
Python вызывает метод __del__, когда все ссылки на объекты исчезли. И в большинстве случаев вы не можете это контролировать. Поэтому не следует использовать метод __del__ для очистки ресурсов. Рекомендуется использовать контекстный менеджер.
- Если __del__ содержит ссылки на объекты, сборщик мусора также уничтожит эти объекты при вызове __del__.
- Если __del__ ссылается на глобальные объекты, это может привести к неожиданному поведению.
- Если внутри метода __del__ возникает исключение, Python не вызывает исключение, а сохраняет его молчанием.
Кроме того, Python отправляет сообщение об исключении в поток stderr. Таким образом, основная программа сможет знать об исключениях во время финализации. Также стоит заметить, что на практике вы будете редко использовать метод __del__.
Пример с методом __del__ в Python
Ниже определяется класс Person со специальным методом __del__, создается новый экземпляр Person и устанавливается значение None:
class Person: def __init__(self, name, age): self.name = name self.age = age def __del__(self): print('__del__ was called') if __name__ == '__main__': person = Person('John Doe', 23) person = None
Выход:
__del__ was called
Когда мы устанавливаем для объекта person значение None, сборщик мусора уничтожает его, поскольку на него нет ссылки. Поэтому был вызван метод __del__.
Если вы используете ключевое слово del для удаления объекта person, также вызывается метод __del__:
person = Person('John Doe', 23) del person
Выход:
__del__ was called
Однако оператор del не вызывает вызов метода __del__, если объект имеет ссылку.