Ответ
В контексте DevOps и автоматизации на Python, метод __delete__() — это часть протокола дескриптора данных. Он вызывается при попытке удалить атрибут объекта с помощью оператора del. Это позволяет реализовать кастомную логику очистки ресурсов (например, закрытие файловых дескрипторов, удаление временных файлов, отмена блокировок) при удалении атрибута.
Практический пример: Дескриптор для управления временным файлом Представьте утилиту для бэкапа, где нужно гарантировать удаление временного файла конфигурации после использования.
import os
import tempfile
class TempFileDescriptor:
"""Дескриптор, создающий и автоматически удаляющий временный файл."""
def __get__(self, obj, objtype=None):
# Возвращаем путь к файлу
return self._filepath
def __set__(self, obj, value):
# Создаем временный файл и записываем в него данные
with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.tmp') as f:
f.write(value)
self._filepath = f.name
print(f"[INFO] Создан временный файл: {self._filepath}")
def __delete__(self, obj):
# Критичная часть: удаление файла при удалении атрибута
if os.path.exists(self._filepath):
os.unlink(self._filepath)
print(f"[INFO] Временный файл удален: {self._filepath}")
else:
print(f"[WARN] Файл уже удален: {self._filepath}")
# Очищаем ссылку
del self._filepath
class BackupConfig:
temp_config = TempFileDescriptor()
# Использование в скрипте автоматизации
config = BackupConfig()
config.temp_config = "server=db01nport=5432" # Вызов __set__, файл создан
# ... используем файл config.temp_config в процессе бэкапа ...
del config.temp_config # Вызов __delete__, файл удален с диска
Зачем это в DevOps?
- Управление ресурсами: Гарантированное освобождение ресурсов (файлы, сокеты, блокировки) даже если скрипт завершился нештатно или разработчик забыл про cleanup.
- Безопасность: Автоматическое удаление временных файлов с чувствительными данными (ключи, пароли).
- Идемпотентность скриптов: Помогает писать скрипты, которые можно безопасно запускать многократно, не оставляя "хвостов" от предыдущих запусков.
Без определения __delete__ оператор del obj.attr вызовет обычное удаление атрибута из пространства имен объекта, что может привести к утечке ресурсов.