モンキーパッチングまたはモンキーパッチとは何なのか理解しようとしています。
それはメソッド/演算子のオーバーロードや委任のようなものですか?
これらと何か共通点があるのでしょうか?
ベストアンサー1
いいえ、そのようなものではありません。実行時に属性を動的に置き換えるだけです。
たとえば、メソッドを持つクラスを考えてみましょうget_data
。このメソッドは外部参照 (たとえば、データベースや Web API) を実行し、クラス内の他のさまざまなメソッドがそれを呼び出します。ただし、単体テストでは外部データ ソースに依存したくないので、メソッドをget_data
固定データを返すスタブに動的に置き換えます。
Python クラスは変更可能であり、メソッドはクラスの単なる属性であるため、好きなだけこれを行うことができます。実際、モジュール内のクラスと関数をまったく同じ方法で置き換えることさえできます。
しかし、コメント投稿者指摘したように、モンキーパッチングを行う際には注意してください。
テスト ロジック以外の何かが呼び出される場合は
get_data
、元のロジックではなく、モンキー パッチを適用した置換ロジックも呼び出されます。これは良い場合もあれば悪い場合もあります。注意してください。get_data
置換時に関数を指す変数または属性が存在する場合、このエイリアスは意味を変更せず、元の を指し続けますget_data
。(なぜでしょうか? Python はクラス内の名前をget_data
他の関数オブジェクトに再バインドするだけで、他の名前のバインドはまったく影響を受けません。)