Affe Patchen einer Klasse in einem anderen Modul in Python
Ich arbeite mit einem Modul, das von jemand anderem geschrieben wurde. Ich würde gerne den Affen patchen__init__
Methode einer im Modul definierten Klasse. Die Beispiele, die ich gefunden habe, um zu zeigen, wie man das macht, haben alle angenommen, ich würde die Klasse selbst anrufen (z.Affen-Patch-Python-Klasse). Dies ist jedoch nicht der Fall. In meinem Fall wird die Klasse innerhalb einer Funktion in einem anderen Modul initialisiert. Siehe das (stark vereinfachte) Beispiel unten:
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()
Gibt es eine Möglichkeit, das zu ändern?__init__
Methode vonSomeClass
so dass wenndosomething
wird von mymodule.py aufgerufen, gibt beispielsweise 43 statt 42 aus? Idealerweise würde ich die bestehende Methode einpacken können.
Ich kann die Third-Party-Modul * .py-Dateien nicht ändern, da andere Skripte von der vorhandenen Funktionalität abhängen. Ich möchte lieber keine eigene Kopie des Moduls erstellen, da die Änderung, die ich vornehmen muss, sehr einfach ist.
Bearbeiten Sie 2013-10-24
Im obigen Beispiel habe ich ein kleines, aber wichtiges Detail übersehen.SomeClass
wird importiert vonthirdpartymodule_b
so was:from thirdpartymodule_a import SomeClass
.
Um den von F.J vorgeschlagenen Patch zu machen, muss ich die Kopie in ersetzenthirdpartymodule_b
, eher, alsthirdpartymodule_a
. z.B.thirdpartymodule_b.SomeClass.__init__ = new_init
.