Implementar e Testar o Método __del__
Nesta etapa, você aprenderá sobre o método __del__. Este método é chamado de finalizador ou destrutor. Ele é invocado quando a contagem de referências de um objeto cai para zero, o que significa que ele está prestes a ser destruído pelo coletor de lixo (garbage collector) do Python. É frequentemente usado para tarefas de limpeza, como fechar conexões de rede ou handles de arquivos.
Você pode remover uma referência a um objeto usando a instrução del. Quando a última referência desaparece, __del__ é chamado automaticamente.
Vamos adicionar um método __del__ à nossa classe Dog para ver quando um objeto é destruído.
Abra o arquivo dog_cat.py novamente. Substitua todo o conteúdo do arquivo pelo código a seguir. Esta versão remove o código que cria uma instância de Dog (para evitar criá-la quando o módulo é importado) e adiciona o método __del__ à classe 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...')
## Adicione este método à classe Dog
def __del__(self):
print(f'The Dog object {self._name} is being deleted.')
Salve o arquivo dog_cat.py.
Agora, vamos criar um script separado para testar esse comportamento. Abra o arquivo test_del.py no explorador de arquivos.
Adicione o seguinte código ao test_del.py. Este script criará duas instâncias de Dog e depois excluirá explicitamente uma delas.
## 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.")
## O coletor de lixo pode não ser executado imediatamente.
## Adicionamos um pequeno atraso para dar tempo para ele rodar.
time.sleep(1)
print("\nScript is about to end. d2 will be deleted automatically.")
Salve o arquivo. Agora, execute o script test_del.py no terminal.
python ~/project/test_del.py
Observe a saída. A mensagem __del__ para Tom aparece após del d1 ser chamado. A mensagem para John aparece no final, pois o objeto d2 é coletado como lixo quando o script termina.
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.
Nota: O tempo exato da coleta de lixo pode variar. __del__ é chamado quando o objeto é coletado, não necessariamente imediatamente após o uso de del.