Małpa łatająca klasę w innym module w Pythonie
Pracuję z modułem napisanym przez kogoś innego. Chciałbym małpować łatkę__init__
metoda klasy zdefiniowanej w module. Przykłady, które znalazłem, pokazujące, jak to zrobić, zakładają, że sam będę nazywał klasę (np.Klasa Pythona z łatką Monkey). Jednak tak nie jest. W moim przypadku klasa jest inicjowana w ramach funkcji w innym module. Zobacz (znacznie uproszczony) przykład poniżej:
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()
Czy jest jakiś sposób na modyfikację__init__
metodaSomeClass
więc kiedydosomething
jest wywoływany z mymodule.py, na przykład wypisuje 43 zamiast 42? Idealnie byłbym w stanie owinąć istniejącą metodę.
Nie mogę zmienić plików * .py trzeciegopartymodule, ponieważ inne skrypty zależą od istniejącej funkcjonalności. Wolałbym nie tworzyć własnej kopii modułu, ponieważ zmiana, którą muszę wprowadzić, jest bardzo prosta.
Edytuj 2013-10-24
W powyższym przykładzie przeoczyłem mały, ale ważny szczegół.SomeClass
jest importowany przezthirdpartymodule_b
lubię to:from thirdpartymodule_a import SomeClass
.
Aby zrobić łatkę sugerowaną przez F.J, muszę ją zastąpićthirdpartymodule_b
raczej niżthirdpartymodule_a
. na przykładthirdpartymodule_b.SomeClass.__init__ = new_init
.