Я работаю с модулем, написанным кем-то другим. Я хочу, чтобы обезьяна исправляла метод __init__
класса, определенного в модуле. Примеры, которые я нашел, показывающие, как это сделать, предположили, что я сам буду называть класс (например, класс Python для Monkey-patch). Однако, это не так. В моем случае класс инициализируется внутри функции в другом модуле. См. Пример (значительно упрощенный) ниже:
thirdpartymodule_a.py
class SomeClass(object):
def __init__(self):
self.a = 42
def show(self):
print self.a
thirdpartymodule_b.py
import thirdpartymodule_a
def dosomething():
sc = thirdpartymodule_a.SomeClass()
sc.show()
mymodule.py
import thirdpartymodule_b
thirdpartymodule.dosomething()
Есть ли способ изменить метод __init__
SomeClass
, чтобы при вызове dosomething
из mymodule.py он, например, печатает 43 вместо 42? В идеале я смогу обернуть существующий метод.
Я не могу изменить файлы thirdpartymodule *.py, поскольку другие скрипты зависят от существующей функциональности. Я бы предпочел не создавать собственную копию модуля, так как изменение, которое мне нужно сделать, очень просто.
Редактировать 2013-10-24
Я проигнорировал небольшую, но важную деталь в приведенном выше примере. SomeClass
импортируется thirdpartymodule_b
следующим образом: from thirdpartymodule_a import SomeClass
.
Чтобы сделать патч, предложенный F.J, мне нужно заменить копию в thirdpartymodule_b
, а не thirdpartymodule_a
. например thirdpartymodule_b.SomeClass.__init__ = new_init
.