Monkey patching (горячая замена, динамическая модификация) — это техника динамического изменения поведения кода во время выполнения программы путем модификации классов, модулей или объектов после их создания.
Monkey patching позволяет:
class Calculator:
def add(self, a, b):
return a + b
# Monkey patch: добавляем новый метод
Calculator.multiply = lambda self, a, b: a * b
calc = Calculator()
print(calc.multiply(3, 4)) # Выведет 12
import some_library
# Заменяем проблемный метод
some_library.BuggyClass.method = fixed_implementation
# Добавляем метод к встроенному классу
list.mean = lambda self: sum(self) / len(self) if self else 0
data = [1, 2, 3]
print(data.mean()) # Выведет 2.0
# В тестах подменяем реальный API на mock-объект
import production_code
production_code.call_external_api = mock_api_response
from contextlib import contextmanager
@contextmanager
def temp_patch(obj, attr, new_value):
original = getattr(obj, attr)
setattr(obj, attr, new_value)
try:
yield
finally:
setattr(obj, attr, original)
with temp_patch(requests, 'get', mock_get):
# Здесь requests.get будет подменен
response = requests.get('https://example.com')
import sys
import fake_ssl
# Подменяем модуль ssl
sys.modules['ssl'] = fake_ssl
Monkey patching — мощный, но опасный инструмент, который стоит использовать для:
Пример с подсветкой (VSCode style):
import datetime
# Monkey patch для добавления новой функциональности
def days_to_new_year(self):
today = self.today()
new_year = datetime.date(today.year + 1, 1, 1)
return (new_year - today).days
datetime.date.days_to_new_year = days_to_new_year
# Использование
print(datetime.date.today().days_to_new_year())