Реализация и тестирование метода __del__
На этом шаге вы узнаете о методе __del__. Этот метод называется финализатором или деструктором. Он вызывается, когда счетчик ссылок на объект падает до нуля, что означает, что он вот-вот будет уничтожен сборщиком мусора Python (garbage collector). Он часто используется для задач очистки, таких как закрытие сетевых соединений или файловых дескрипторов.
Вы можете удалить ссылку на объект, используя оператор del. Когда последняя ссылка исчезает, __del__ вызывается автоматически.
Давайте добавим метод __del__ в наш класс Dog, чтобы увидеть, когда объект уничтожается.
Снова откройте файл dog_cat.py. Замените все содержимое файла следующим кодом. Эта версия удаляет код, который создает экземпляр Dog (чтобы избежать его создания при импорте модуля), и добавляет метод __del__ в класс Dog.
## File Name: dog_cat.py
class Animal:
def __init__(self, name):
self._name = name
def say(self):
print(self._name + ' is saying something')
class Dog(Animal):
def __new__(cls, name, age):
instance = super().__new__(cls)
return instance
def __init__(self, name, age):
super().__init__(name)
self.age = age
def say(self):
print(self._name + ' is making a sound: wang wang wang...')
## Добавьте этот метод в класс Dog
def __del__(self):
print(f'The Dog object {self._name} is being deleted.')
Сохраните файл dog_cat.py.
Теперь давайте создадим отдельный скрипт для тестирования этого поведения. Откройте файл test_del.py в проводнике файлов.
Добавьте следующий код в test_del.py. Этот скрипт создаст два экземпляра Dog, а затем явно удалит один из них.
## File Name: test_del.py
from dog_cat import Dog
import time
print("Creating two Dog objects: d1 and d2.")
d1 = Dog('Tom', 3)
d2 = Dog('John', 5)
print("\nDeleting reference to d1...")
del d1
print("Reference to d1 deleted.")
## Сборщик мусора может запуститься не сразу.
## Мы добавляем небольшую задержку, чтобы дать ему время поработать.
time.sleep(1)
print("\nScript is about to end. d2 will be deleted automatically.")
Сохраните файл. Теперь запустите скрипт test_del.py в терминале.
python ~/project/test_del.py
Наблюдайте за выводом. Сообщение __del__ для Tom появляется после вызова del d1. Сообщение для John появляется в самом конце, так как объект d2 собирается сборщиком мусора по завершении работы скрипта.
Creating two Dog objects: d1 and d2.
Deleting reference to d1...
The Dog object Tom is being deleted.
Reference to d1 deleted.
Script is about to end. d2 will be deleted automatically.
The Dog object John is being deleted.
Примечание: Точное время запуска сборки мусора может варьироваться. __del__ вызывается, когда объект собирается, а не обязательно сразу после использования del.