Я працюю з модулем, написаним кимось іншим. Я хотів би, щоб мавпа виправила __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
.