Метод __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__, если объект имеет ссылку.

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *