問題タブ [monkeypatching]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 既存のオブジェクトインスタンスへのメソッドの追加
Pythonで既存のオブジェクト(つまり、クラス定義にない)にメソッドを追加できることを読みました。
そうすることが必ずしも良いとは限らないことを私は理解しています。しかし、どうすればこれを行うことができますか?
python - Python でモンキーパッチを適用するにはどうすればよいですか?
私はPythonでいくつかの内省をしなければなりませんでしたが、それはきれいではありませんでした:
のようなものを得るには
デバッグ出力で。
理想的には、この種の情報を stderr の前に追加したいと思います - Python 内でグローバルに print の動作を変更することは可能ですか?
java - BCEL == javaのモンキーパッチですか?
先日、同僚がBCELを教えてくれました。これは、彼の説明と簡単な説明からわかるように、実行時にバイトコードを変更する方法です。私の最初の考えはそれが危険に聞こえるということでした、そして私の2番目の考えはそれがクールに聞こえるということでした。それから私はそれをもう少し考えて、モンキーパッチに関するコーディングホラーの投稿を思い出し、これが基本的に同じことであることに気づきました。誰かが実用的な何かのためにBCELを使用したことがありますか?これは基本的に実行時のモンキーパッチであるというのは正しいですか、それとも何かが足りないのでしょうか?
apache-flex - フレックスフレームワークにパッチを適用して、プリローダーを即座に表示しますか?
Flexフレームワークでは、サイトの読み込み中にカスタムプリローダーを使用できます。
Adobeのドキュメントでは、ダウンロードから700ミリ秒後にアプリケーションの半分未満がダウンロードされた場合にプログレスバー[プリローダー]が表示されるように指定されています。'
ただし、ユーザーの95%が初めての訪問者であり、サイトが500kbを超えていることを知っているので、常にプリローダーをすぐに表示したいと思っています。プリローダーアニメーションが表示されるまで0.7秒待たなくてはなりません。
理論的には、フレームワークに「モンキーパッチ」を適用して、この.7秒の制限を取り除くことができると思います。私はその方法を理解する時間がありません、そして私は前にそれをしたことがありません。
誰か助けますか?
python - Pythonのコアタイプにパッチメソッドを適用できますか?
Rubyは、Numberクラスやその他のコアタイプにメソッドを追加して、次のような効果を得ることができます。
しかし、Pythonではこれができないようです。これは本当ですか?もしそうなら、なぜですか?タイプを変更できないという事実と関係がありますか?
更新:モンキーパッチのさまざまな定義について話すのではなく、上記の例に焦点を当てたいと思います。あなた方の何人かが答えたので、私はすでにそれをすることができないと結論を下しました。しかし、なぜそれができないのか、そしておそらくPythonで利用可能な場合、どの機能がこれを可能にするのかについて、より詳細な説明が必要です。
あなたの何人かに答えるために:私がこれをしたいと思うかもしれない理由は単に美学/読みやすさです。
これは英語に似ており、次のように、テストされた値と期待値を明確に示しています。
この概念は、Rspecおよび他のいくつかのRubyフレームワークが基づいているものです。
apache-flex - RSLとしてロードされたときのモンキーパッチフレックスフレームワーク?
フレックスフレームワークをRSL(SWZ、プレーヤーキャッシングを使用)としてロードしたいのですが、フレームワークのいくつかのバグ修正にモンキーパッチを適用する必要があります。
多くのフォーラムは、これが不可能であることを示唆しています。誰かがこれを機能させましたか?
ruby - Fixnum などの Ruby の基本クラスにパッチを適用することは許容されますか?
私はまだ Ruby に非常に慣れていません (つるはしを読み、ほとんどの時間を .NET に費やしていますirb
)。Ruby でクラスにパッチを適用できることがわかったので、それがいつ許容されるのか、具体的にはそれが許容されるかどうか疑問に思っていますRuby の基本クラスにパッチを当てます。例: ここで別の Ruby の質問に答えました。ここでは、投稿者が から時間を減算する方法を知りたがっていましたDateTime
。DateTime
クラスはこの機能を提供していないように見えるため、可能な解決策としてクラスとクラスにパッチを当てる回答を投稿しましDateTime
たFixnum
。これは私が提出したコードです:
クラスにパッチを適用したのは、この例では、DateTime
. 具体的には、上記のコードの結果として、次のようなことができます。
これはかなり見やすく、理解しやすいようです。DateTime
ただし、の-
演算子の機能をいじるのが良い考えかどうかはわかりません。
この状況で考えられる唯一の選択肢は次のとおりです。
1.DateTime
オンザフライで新しいオブジェクトを作成し、呼び出しで新しい時間の値を計算するだけです。new
DateTime
2. aと、そこから減算する時間数を受け入れるユーティリティ メソッドを作成します。
基本的に、方法 (1) の単なるラッパーです。
DateTime
3.の既存の動作を変更する代わりに、新しいメソッドを追加します#-()
おそらく、次のような構文を可能にするために、パッチとDateTime#less
一緒に機能する新しいメソッドです。Fixnum#hours
ただし、既に述べたように、パッチを適用するアプローチを採用したのは、より表現力豊かな構文が得られると考えたからです。
私のアプローチに何か問題がありますか、またはこれを行うために3つの選択肢の1つ(または私が考えていない別のもの)を使用する必要がありますか? パッチを適用することが Ruby の問題に対する新しい「ハンマー」になりつつあると感じているので、「Ruby のやり方」で物事を行っているかどうかについてフィードバックを得たいと思います。
ruby-on-rails - RailsのIntegerクラスにメソッドを追加するのに最適な場所はどこですか?
Railsで整数クラスにメソッドを追加するのに最適な場所はどこですか? to_meters
およびto_miles
メソッドを追加したいと思います。
ruby - モンキーパッチ対。堅実な原則?
私はいくつかの個人的なプロジェクトで PHP5 から Python にゆっくりと移行しており、現在その経験が気に入っています。Python ルートをたどることを選択する前に、私は Ruby に目を向けました。Ruby コミュニティから私が気付いたのは、モンキー パッチが一般的であり、高く評価されていることです。ruby s/w のデバッグの試行に関する多くの恐ろしい話にも出くわしました。なぜなら、だれかが小さな仕事をするために比較的無害なライブラリを含めたのに、誰にも言わずに、頻繁に使用されるコア オブジェクトにパッチを当てたからです。
私が Python を選んだのは、(他の理由の中でも) 簡潔な構文と、Ruby ができるすべてのことを実行できるという事実のためです。Python は OO クリックを PHP よりもはるかに優れたものにしており、この理解を深めるために OO の原則についてますます読んでいます。
今晩、私はRobert Martin の SOLID の原則について読んでいます。
- 単一責任原則、
- オープン/クローズド原則、
- リスコフ置換原理、
- インターフェイス分離の原則、および
- 依存性逆転の原則
私は現在、O :ソフトウェアエンティティ (クラス、モジュール、機能など) は、拡張のためにオープンにする必要がありますが、変更のためにクローズする必要があります。
OO 設計の一貫性を確保することと、モンキー パッチ全体との間の対立について頭が混乱しています。Pythonでモンキーパッチを適用できることを理解しています。また、「pythonic」であることは、よくテストされた一般的な oop のベスト プラクティスと原則に従うことであることも理解しています。
私が知りたいのは、相反する 2 つのテーマに関するコミュニティの意見です。それらがどのように相互運用されるか、一方を他方よりも使用するのが最善の場合、モンキーパッチを行う必要があるかどうか...うまくいけば、問題の解決策を提供していただけます。
python - Extending builtin classes in python
How can I extend a builtin class in python?
I would like to add a method to the str class.
I've done some searching but all I'm finding is older posts, I'm hoping someone knows of something newer.