1. ホーム
  2. python

[解決済み] モンキーパッチとは何ですか?

2022-03-14 14:33:23

質問

モンキーパッチとは何ですか?

それは、メソッド/オペレータのオーバーロードやデリゲーションのようなものでしょうか?

これらと共通することはありますか?

解決方法は?

いいえ、そのようなものではありません。単に実行時に属性をダイナミックに置き換えるだけです。

例えば、あるクラスがメソッド get_data . このメソッドは (データベースやウェブ API などの) 外部からの検索を行い、クラスのさまざまなメソッドからこのメソッドを呼び出します。しかし、ユニットテストでは外部のデータソースに依存したくないので、メソッドを動的に置き換えることにします。 get_data メソッドを、固定データを返すスタブに置き換えます。

Pythonのクラスは変更可能であり、メソッドはクラスの属性に過ぎないので、好きなだけこれを行うことができます。実際、まったく同じ方法でモジュール内のクラスと関数を置き換えることさえできます。

しかし コメンテーター モンキーパッチを適用する場合は注意が必要です。

  1. テストロジック以外のものが get_data も同様に、オリジナルではなく、あなたのモンキーパッチを当てた代替品を呼び出すことになります -- これは良いことも悪いこともあります。良いことも悪いこともあります。

  2. を指す変数や属性が存在する場合、その変数や属性もまた get_data 関数に置き換えたとしても、このエイリアスはその意味を変えず、引き続き元の get_data . (なぜかというと、Pythonは単に get_data を他の関数オブジェクトにバインディングします。)