Я працюю з модулем, написаним кимось іншим. Я хотів би, щоб мавпа виправила __init__метод класу, визначеного в модулі. Приклади, які я знайшов, що показують, як це зробити, припускали, що я сам закликаю клас (наприклад, клас Monkey-patch Python ). Однак це не так. У моєму випадку клас італізується в межах функції в іншому модулі. Дивіться (значно спрощений) приклад нижче:
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_b.dosomething()
Чи є спосіб модифікувати __init__метод, SomeClassщоб при dosomethingвиклику з mymodule.py він, наприклад, друкував 43 замість 42? В ідеалі я міг би обернути існуючий метод.
Я не можу змінити файли Third-PartyModule * .py, оскільки інші сценарії залежать від існуючих функціональних можливостей. Я волів би не створювати власну копію модуля, оскільки зміна, яку мені потрібно внести, дуже проста.
Редагувати 24.10.2013
Я пропустив невелику, але важливу деталь у наведеному вище прикладі. SomeClassімпортується thirdpartymodule_bяк це: from thirdpartymodule_a import SomeClass.
Щоб зробити патч, запропонований FJ, мені потрібно замінити копію thirdpartymodule_b, а не thirdpartymodule_a. напр thirdpartymodule_b.SomeClass.__init__ = new_init.