Resumo : neste tutorial, você aprenderá o conceito de monkey patching em Python, quando usá-lo e como aplicá-lo de forma eficaz.
Introdução ao patch de macaco Python
Monkey patching é uma técnica que permite modificar ou estender o comportamento de módulos , classes ou funções existentes em tempo de execução sem alterar o código-fonte original.
Aplicando patch de macaco
Para aplicar a técnica de patch de macaco, siga estas etapas:
- Primeiro, identifique o destino que pode ser um módulo, classe, método ou função que você deseja corrigir.
- Segundo, crie seu patch escrevendo código para adicionar, modificar ou substituir a lógica existente.
- Terceiro, aplique o patch usando uma atribuição para aplicá-lo ao destino. O patch substituirá ou estenderá o comportamento existente.
Embora o monkey patching seja uma ferramenta poderosa, você deve usá-la com cuidado para evitar comportamentos inesperados.
Exemplo de patch de macaco
Suponha que você tenha MyClass
uma classe que possui apenas um __init__()
método:
class Robot:
def __init__(self, name):
self.name = name
Linguagem de código: Python ( python )
Para estender o comportamento da Robot
classe em tempo de execução sem alterá-la Robot
, você pode usar a técnica de monkey patching.
Imagem que você precisa para estender um comportamento que permita que as instâncias do Robô falem. Aqui estão as etapas para fazer isso:
Primeiro, defina uma função chamada add_speech
que aceite uma classe como parâmetro:
def add_speech(cls):
cls.speak = lambda self, message: print(message)
return cls
Linguagem de código: Python ( python )
A add_speech()
função adiciona o speak()
método adicionando um atributo speak à cls
classe e atribuindo uma expressão lambda e retornando a classe. A expressão lambda aceita uma mensagem e a exibe no console.
Segundo, corrija a Robot
classe passando-a para o add_speech()
método:
Robot = add_speech(Robot)
Linguagem de código: Python ( python )
Após esta linha de código, a Robot
classe terá o speak()
método.
Observe que você pode usar a add_speech()
função para corrigir qualquer classe, não apenas a Robot
classe.
Terceiro, crie uma nova instância da classe Robot e chame o speak()
método:
robot = Robot('Optimus Prime')
robot.speak('Hi')
Linguagem de código: Python ( python )
Junte tudo:
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
Linguagem de código: Python ( python )
Se você executar o programa, verá a seguinte saída:
Hi
Linguagem de código: Python ( python )
Como esta linha de código é um decorador:
Robot = add_speech(Robot)
Linguagem de código: Python ( python )
você pode removê-lo e usar a sintaxe do decorador :
@add_speech
class Robot:
def __init__(self, name):
self.name = name
Linguagem de código: Python ( python )
O novo código ficará assim:
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')
Linguagem de código: Python ( python )
Quando usar patch de dinheiro
Na prática, você deve usar o monkey patch somente quando necessário, pois pode dificultar a compreensão e a depuração do código.
Por exemplo, se você usa uma biblioteca de terceiros e ela tem um bug urgente que você não pode esperar pelo lançamento oficial. Nesse caso, você pode usar o monkey patching para aplicar correções rápidas enquanto espera por uma solução adequada.
Outro cenário é que você deseja adicionar funcionalidade a classes que não controla e não pode usar outras técnicas como herança ou composição. O monkey patching é útil neste caso.
Na prática, você encontrará monkey patching na biblioteca simulada, como o unittest.mock
módulo padrão. O unittest.mock
módulo possui patch()
um método que substitui temporariamente um alvo por um objeto simulado.
Resumo
- A técnica de monkey patching em Python permite modificar ou estender dinamicamente o código existente em tempo de execução sem alterar o código original.
- Use a técnica de patch de macaco se tiver um bom motivo para fazê-lo.