Monkey patching (манкипатчинг) в Python

В этом уроке вы изучите концепцию monkey patching (манкипатчинг) в Python, когда его использовать и как эффективно применять.

Содержание

Что такое monkey patching в Python?

Monkey patching в Python — это метод, который позволяет вам изменять или расширять поведение существующих модулей, классов или функций во время их выполнения без изменения исходного кода.

Применение манкипатчинга

Чтобы применить данную технику, выполните следующие действия:

  • Сначала определите цель, которая может быть модулем, классом, методом или функцией, которую вы хотите исправить.
  • Во-вторых, создайте свой monkey patch, написав код для добавления, изменения или замены существующей логики.
  • В-третьих, примените патч, используя назначение, чтобы достичь цели. Monkey patching перезапишет или расширит существующее поведение.

Хотя monkey patching является мощным инструментом, вам следует использовать его осторожно, чтобы избежать непредвиденного поведения.

Пример с monkey patching

Предположим, у вас есть класс MyClass, который имеет только метод __init__():

class Robot:
    def __init__(self, name):
        self.name = name

Чтобы расширить поведение класса Robot во время выполнения без изменения класса Robot, вы можете использовать технику monkey patching.

Рассмотрим, что вам нужно предпринять, чтобы расширить поведение, позволяющее экземплярам Robot говорить. Вот шаги, которые нужно сделать:

  • Сначала определите функцию add_speech, которая принимает класс в качестве параметра:
def add_speech(cls):
    cls.speak = lambda self, message: print(message)
    return cls

Функция add_speech() добавляет метод talk(), добавляя атрибут talk к классу cls, присваивая лямбда-выражение и возвращая класс. Лямбда-выражение принимает сообщение и отображает его на консоли.

  • Во-вторых, исправьте класс Robot, передав его методу add_speech():
Robot = add_speech(Robot)

После этой строки кода класс Robot будет иметь метод talk().

Обратите внимание, что вы можете использовать функцию add_speech() для исправления любых классов, а не только класса Robot.

  • В-третьих, создайте новый экземпляр класса Robot и вызовите метод talk():
robot = Robot('Optimus Prime')
robot.speak('Hi')

Соединим все это вместе:

def add_speech(cls):
    cls.speak = lambda self, message: print(message)
    return cls


class Robot:
    def __init__(self, name):
        self.name = name


Robot = add_speech(Robot)

robot = Robot('Optimus Prime')
robot.speak('Hi')Hi

Если вы запустите программу, вы увидите следующий вывод:

Hi

Поскольку эта строка кода является декоратором:

Robot = add_speech(Robot)

вы можете удалить ее и использовать синтаксис декоратора:

@add_speech
class Robot:
    def __init__(self, name):
        self.name = name

Новый код будет выглядеть так:

def add_speech(cls):
    cls.speak = lambda self, message: print(message)
    return cls


@add_speech
class Robot:
    def __init__(self, name):
        self.name = name


robot = Robot('Optimus Prime')
robot.speak('Hi')

Когда использовать monkey patching в Python?

На практике monkey patching следует использовать только в случае необходимости, поскольку это может затруднить понимание и отладку кода.

Например, если вы используете стороннюю библиотеку и в ней есть срочная ошибка, вы не можете дождаться официального релиза. В этом случае вы можете использовать манкипатчинг, чтобы применить быстрые исправления, ожидая правильного решения.

Другой сценарий заключается в том, что вы хотите добавить функциональность к классам, которые вы не контролируете, и вы не можете использовать другие методы, такие как наследование или композиция, в этом случае полезно использовать monkey patching.

На практике вы найдете манкипатчинг в библиотеке макетов, например в стандартном модуле unittest.mock. Модуль unittest.mock имеет метод patch(), который временно заменяет цель фиктивным объектом.

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *