719

理解しようとしているのですが、モンキーパッチまたはモンキーパッチとは何ですか?

それは、メソッド/演算子のオーバーロードまたは委任のようなものですか?

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

4

8 に答える 8

660

いいえ、それらのいずれとも異なります。これは、実行時に属性を動的に置き換えるだけです。

たとえば、メソッドを持つクラスを考えてみましょうget_data。このメソッドは、(データベースや Web API などで) 外部ルックアップを実行し、クラス内の他のさまざまなメソッドがそれを呼び出します。ただし、単体テストでは、外部データ ソースに依存したくないため、get_data固定データを返すスタブでメソッドを動的に置き換えます。

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

ただし、コメント投稿者が指摘したように、モンキーパッチを適用するときは注意してください。

  1. テストロジック以外の何かが呼び出さget_dataれると、オリジナルではなく、モンキーパッチを適用した代替品も呼び出されます。これは、良い場合も悪い場合もあります。ただ気をつけてください。

  2. 置換するまでに関数を指す変数または属性が存在する場合get_data、このエイリアスはその意味を変更せず、引き続き元の を指しget_dataます。(なぜですか? Pythonget_dataは、クラス内の名前を他の関数オブジェクトに再バインドするだけです。他の名前のバインドはまったく影響を受けません。)

于 2011-04-11T19:10:57.340 に答える
413

MonkeyPatch は、実行時 (通常は起動時) に他のコードを拡張または変更する Python コードの一部です。

簡単な例は次のようになります。

from SomeOtherProduct.SomeModule import SomeClass

def speak(self):
    return "ook ook eee eee eee!"

SomeClass.speak = speak

出典: Zope wiki の MonkeyPatchページ。

于 2011-07-11T08:52:36.207 に答える
36

ウィキペディアによると:

Pythonでは、モンキーパッチという用語は、実行時にクラスまたはモジュールを動的に変更することのみを指します。これは、既存のサードパーティコードに、希望どおりに機能しないバグまたは機能の回避策としてパッチを適用することを目的としています。

于 2011-04-11T19:08:52.473 に答える
18

まず、モンキー パッチは邪悪なハックです (私の意見では)。

モジュールまたはクラス レベルのメソッドをカスタム実装に置き換えるためによく使用されます。

最も一般的なユースケースは、元のコードを置き換えることができない場合に、モジュールまたはクラスのバグの回避策を追加することです。この場合、サルのパッチを適用して「間違った」コードを独自のモジュール/パッケージ内の実装に置き換えます。

于 2011-04-11T19:11:13.617 に答える
13

モンキー パッチは動的言語でのみ実行できます。動的言語の python はその良い例です。オブジェクト定義を更新する代わりに実行時にメソッドを変更することはその一例です。同様に、実行時に属性 (メソッドまたは変数) を追加することは、モンキー パッチと見なされます。これらは、オブジェクト定義を簡単に変更できないように、ソースを持っていないモジュールを操作するときによく行われます。

これは、オブジェクトの定義が実際の動作を完全または正確に記述していないことを意味するため、悪いと見なされます。

于 2011-04-11T20:01:14.570 に答える