「a!」を出力するだけの単一の関数を持つ Python モジュールを作成しました。Python インタープリターを開き、モジュールを 2 つの異なる構文でインポートしました
>>> import a
>>> from a import func
>>> func()
a!
>>> a.func()
a!
この時点で、 func を変更して別のものを出力し、再度評価します
>>> func()
a!
>>> a.func()
a!
モジュールがリロードされていないため、これは当然のことです。次に、モジュールをリロードし、両方の機能が更新されることを期待しましたが、次のようになりました。
>>> reload(a)
<module 'a' from 'a.py'>
>>> a.func()
aasd!
>>> func()
a!
a.func だけが更新されるようです。Python は同じモジュールのインスタンスを 1 つだけ保持しているといつも思っていましたが、現在は 2 つあるようです。私の主張を検証するためにさらにテストを行い、モジュールの最上位に print ステートメントを追加し、インタープリターを再起動して再度インポートしました。
>>> import a
module imported
>>> import a
>>> from a import func
「モジュールがインポートされました」が2回表示されると思っていたので、これはさらに混乱します。私が行った 3 番目の実験は、グローバル変数の実験でした。
>>> import a
module imported
>>> from a import GLOBAL_VAR
>>> GLOBAL_VAR = 5
>>> a.GLOBAL_VAR
1
>>> GLOBAL_VAR
5
>>> GLOBAL_VAR is a.GLOBAL_VAR
False
モジュールのインスタンスは 1 つですが、内部のオブジェクトのインスタンスは異なるのでしょうか? このような動作でGevent のモンキー パッチを実装するにはどうすればよいでしょうか?