ホームページ >バックエンド開発 >Python チュートリアル >Python のモンキーパッチとは何ですか

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

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼転載
2020-01-04 17:45:503157ブラウズ

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

実行時の属性の動的な置換は、モンキー パッチと呼ばれます。

#なぜモンキー パッチと呼ばれるのか

#ランタイムの属性置換はサルとは何の関係もありません。その起源については 2 つの意見があります。オンラインで見つかったモンキー パッチの。 :

1. この単語はもともとゲリラ パッチ (雑多な軍隊、ゲリラ軍) でした。つまり、この部分がオリジナルではありません。英語では、ゲリラの発音はゴリア (オランウータン)、後に猿(サル)と表記されるようになりました。

2. もう一つの説明は、この方法は元のコードをめちゃくちゃにする(いじる)ため、英語ではMonkeying About(いたずら)と呼ばれるため、Monkey Patchと呼ばれるというものです。

モンキーパッチという名前は、「モジュールランタイム置き換えの機能」に相当するものなので、ちょっとわかりにくいです。

モンキーパッチの使い方

1. 実行時に動的にモジュールを入れ替える方法

stackoverflow

consider a class that has a method get_data. This method does an
external lookup (on a database or web API, for example), and various
other methods in the class call it. However, in a unit test, you don't
want to depend on the external data source - so you dynamically
replace the get_data method with a stub that returns some fixed data.

クラスに get_data メソッドがあるとします。このメソッドは、いくつかの外部クエリ (データベースや Web API へのクエリなど) を実行し、クラス内の他の多くのメソッドがそれを呼び出します。ただし、単体テストでは、外部データ ソースに依存したくありません。そこで、この get_data メソッドを、テスト データを返すだけのダム メソッド状態に置き換えます。

別の引用例は、Zope wiki の Monkey Patch の説明です:

from SomeOtherProduct.SomeModule import SomeClass
def speak(self):
    return "ook ook eee eee eee!"
SomeClass.speak = speak

さらに実践的な例もあります。多くのコードは import json を使用しています。後で、ujson の方がパフォーマンスが高いことが判明しました。 ujson を json としてインポートするように各ファイルのインポート json を変更するほうがコストがかかると感じる場合、または json を ujson に置き換えることが期待どおりかどうかをテストしたい場合は、次を追加するだけです:

import json
import ujson
def monkey_patch_json():
    json.__name__ = 'ujson'
    json.dumps = ujson.dumps
    json.loads = ujson.loads
monkey_patch_json()

入口の

2。実行時にモジュールを動的に追加する方法はたくさんあります。

このようなシナリオはたくさんあります。たとえば、チームの一般ライブラリ内のモジュールを参照し、モジュールの機能を充実させるには、継承だけでなくMonkey.Patchの利用も検討できます。

個人的には、Monkey Patch は利便性をもたらしますが、ソース コードの優雅さを台無しにする危険性もあると感じています。

PHP 中国語 Web サイトには、無料の

Python ビデオ チュートリアル が多数あり、誰でも学習することができます。

この記事は、https://www.jianshu.com/p/a19f936471e4

から転載されました。

以上がPython のモンキーパッチとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjianshu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。