[解決済み] Pythonで他のモジュールにあるクラスを修正するモンキーパッチ
質問
他の人が書いたモジュールで作業しています。私は
__init__
メソッドにパッチを当てたいと思っています。私が見つけたこれを行う方法を示す例は、すべて私自身がクラスを呼び出すことを想定しています (例.
モンキーパッチの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 から呼び出されたとき、例えば42の代わりに43を表示するようにできますか?理想的には、私は既存のメソッドをラップすることができると思います。
他のスクリプトが既存の機能に依存しているので、私はthirdpartymodule*.pyファイルを変更することができません。私が行う必要がある変更は非常に単純であるため、私はむしろ、モジュールの私自身のコピーを作成する必要がないことを望みます。
編集 2013-10-24
上の例で、小さいけれども重要なことを見落としていました。
SomeClass
がインポートされるのは
thirdpartymodule_b
のようにします。
from thirdpartymodule_a import SomeClass
.
F.J が提案したパッチを適用するために、私は
thirdpartymodule_b
よりも、むしろ
thirdpartymodule_a
です。
thirdpartymodule_b.SomeClass.__init__ = new_init
.
どのように解決するのですか?
以下のようにするとうまくいくはずです。
import thirdpartymodule_a
import thirdpartymodule_b
def new_init(self):
self.a = 43
thirdpartymodule_a.SomeClass.__init__ = new_init
thirdpartymodule_b.dosomething()
新しいinitで古いinitを呼び出したい場合は、以下のように
new_init()
の定義を以下のように置き換えてください。
old_init = thirdpartymodule_a.SomeClass.__init__
def new_init(self, *k, **kw):
old_init(self, *k, **kw)
self.a = 43
関連
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] プライベートメソッド、フィールド、インナークラスを持つクラスをテストするにはどうすればよいですか?
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] 億の相対的輸入
-
[解決済み] モンキーパッチとは何ですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] Python Logging でログメッセージが2回表示される件
-
[解決済み] Celeryタスクのユニットテストはどのように行うのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] PythonでファイルのMD5チェックサムを計算するには?重複
-
[解決済み] SQLAlchemy: 日付フィールドをフィルタリングする方法は?
-
[解決済み] PythonからSMTPを使用してメールを送信する
-
[解決済み] 値で列挙名を取得する [重複]。
-
[解決済み] 範囲指定された浮動小数点数のランダムな配列を生成します。
-
[解決済み] 異なる順序で同じ要素を持つ2つのJSONオブジェクトを等しく比較するには?
-
[解決済み] Pandasのデータフレーム内の文字列を'date'データ型に変換するにはどうしたらいいですか?
-
[解決済み] Pythonでファイルの読み込みと上書きをする
-
[解決済み] Pythonでランダムなファイル名を生成する最良の方法
-
[解決済み] Django filter queryset __in for *every* item in list