Macaco corrigindo uma classe em outro módulo em Python
Estou trabalhando com um módulo escrito por outra pessoa. Eu gostaria de remendar macaco__init__
método de uma classe definida no módulo. Os exemplos que eu encontrei mostrando como fazer isso todos assumiram que eu estaria chamando a classe eu mesmo (por exemplo,Classe Python de patch de macaco). No entanto, este não é o caso. No meu caso, a classe é inicializada dentro de uma função em outro módulo. Veja o exemplo (muito simplificado) abaixo:
thirdpartymodule_a.py
class SomeClass(object):
def __init__(self):
self.a = 42
def show(self):
print self.a
terceiropartymodule_b.py
import thirdpartymodule_a
def dosomething():
sc = thirdpartymodule_a.SomeClass()
sc.show()
mymodule.py
import thirdpartymodule_b
thirdpartymodule.dosomething()
Existe alguma maneira de modificar o__init__
método deSomeClass
para que quandodosomething
é chamado de mymodule.py, por exemplo, imprime 43 em vez de 42? Idealmente, eu seria capaz de envolver o método existente.
Não consigo alterar os arquivos thirdpartymodule * .py, pois outros scripts dependem da funcionalidade existente. Eu prefiro não ter que criar minha própria cópia do módulo, pois a mudança que preciso fazer é muito simples.
Editar 2013-10-24
Eu negligenciei um pequeno mas importante detalhe no exemplo acima.SomeClass
é importado porthirdpartymodule_b
como isso:from thirdpartymodule_a import SomeClass
.
Para fazer o patch sugerido por F.J eu preciso substituir a cópia emthirdpartymodule_b
, ao invés dethirdpartymodule_a
. por exemplo.thirdpartymodule_b.SomeClass.__init__ = new_init
.