Ответ
Monkey patching — это техника динамического изменения (замены) атрибутов или методов классов и модулей во время выполнения программы. Это позволяет модифицировать поведение стороннего кода без изменения его исходников.
Этот подход является мощным, но рискованным, так как может приводить к трудноотлавливаемым ошибкам и несовместимости при обновлении библиотек.
Основные сценарии использования:
- Тестирование: Замена внешних зависимостей (например, сетевых запросов или работы с базой данных) на mock-объекты. Библиотека
unittest.mock.patch
активно использует этот механизм. - Исправление багов: Временное исправление ошибок в сторонней библиотеке до выхода официального патча.
- Добавление функциональности: Расширение возможностей существующего класса.
Пример:
import datetime
# Сохраняем оригинальный метод
_original_datetime_now = datetime.datetime.now
def patched_now():
# Всегда возвращаем фиксированную дату
return datetime.datetime(2023, 1, 1, 12, 0, 0)
# Применяем monkey patch
datetime.datetime.now = patched_now
# Теперь любой вызов datetime.datetime.now() вернет нашу дату
print(f"Текущее время после патча: {datetime.datetime.now()}")
# Вывод: Текущее время после патча: 2023-01-01 12:00:00
# Возвращаем оригинальное поведение (важно для чистоты кода)
datetime.datetime.now = _original_datetime_now