Rails は、開発時のリロードを次のように実装します。2 つのメカニズムが働いています。
- コードが存在しないクラスを参照するときはいつでも、コールバック (const_missing) を呼び出すことができます。Rails はそのようなコールバックをインストールします。このコールバックでは、アプリケーション ロード パスの 1 つ (アプリ/モデルなど) に対応するクラスがあるかどうかを確認し、それをロードして続行します。このメカニズムは「Rails オートローディング」と呼ばれます (Ruby のオートローディングと混同しないでください。これは別のものです)。
- Rails は、オートロードされたクラスを追跡します。リクエストの最後に、これらのクラスをすべてメモリから削除します。
明らかに、これにはいくつかの制限があります。コードがグローバル変数に何かを格納している場合、Rails はリクエストの最後にそれらをクリアしません。そのため、グローバル変数が大きくなり続けると、開発中にメモリ リークが発生します。また、リロードにより、本番環境での開発間でセマンティクスに微妙な違いが生じます。一方、次のようなもの
scope :older_than_one_year, where('date < ?', 1.year.ago)
開発では意図したとおりに機能します (リクエストごとにモデルがリロードされ、1.year.ago が常に再評価されるため)、本番環境では意図したとおりに機能しません (1.year.ago は 1 回しか評価されないため) 、つまり、アプリが 1 年間実行されている場合、そのスコープは実際には2 年前に変換されます)。
Python で何かを実装できるかどうか、Python のオンザフライ クラス作成/変更/削除機能に慣れていないか、const_missing に似たフックがあるかどうかはわかりません。