Ich arbeite mit einem Modul, das von jemand anderem geschrieben wurde. Ich möchte die __init__
Methode einer im Modul definierten Klasse mit einem Affen-Patch versehen . Die Beispiele, die ich gefunden habe, um zu zeigen, wie das geht, haben alle angenommen, dass ich die Klasse selbst aufrufen würde (z. B. Python-Klasse mit Affen-Patch ). 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_b.dosomething()
Gibt es eine Möglichkeit, die __init__
Methode SomeClass
so zu ändern , dass beim dosomething
Aufruf von mymodule.py beispielsweise 43 statt 42 gedruckt wird? Idealerweise könnte ich die vorhandene Methode umbrechen.
Ich kann die .py-Dateien für das dritte Modul * 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 2013-10-24
Ich habe im obigen Beispiel ein kleines, aber wichtiges Detail übersehen. SomeClass
wird thirdpartymodule_b
wie folgt importiert : from thirdpartymodule_a import SomeClass
.
Um den von FJ vorgeschlagenen Patch zu erstellen, muss ich die Kopie ersetzen thirdpartymodule_b
und nicht thirdpartymodule_a
. zB thirdpartymodule_b.SomeClass.__init__ = new_init
.