で行っているように、Pythonスクリプトを直接実行するとpython a.py、Pythonインタープリターはそのファイルのモジュールパスがどうあるべきかを推測しません。というモジュールを作成して__main__実行するだけです。
もう 1 つの微妙な点は、Python がインポートに遭遇するたびに、最初にモジュールを作成して格納しsys.modules、同じモジュールの他のすべてのインポートが同じモジュール オブジェクトを生成するようにすることです。ブレッドクラムが残っている場合にのみ、そのモジュールを実装する Python コードの実行が開始されます。
python a.pyシェル コンソールで入力すると、Python が__main__モジュールを作成し、そのファイルの評価を開始します。
the file being parsed
|
| the module being imported
| |
./a.py __main__ 1: import b
わかりました。まず、a.py何かをインポートします。以前にインポートされたことがないため、パスを検索して見つけb.pyます。まだ別のファイルをインポートしようとしているので、それを示すために少しインデントします。
./b.py b 1: from a import orig
で最初に起こるb.pyことは、インポートを試みることaです。しかし、aインポートされたこともありません。Python がパスを検索すると、a.py
./a.py a 1: import b
おなじみのようです。しかし、bはインポートされています。これbは同じものになります (まだインポート中です!
./a.py a 2: class orig:
./a.py a 3: def test(self):
./a.py a 4: print("hello")
./a.py a 5:
./a.py a 6:
./a.py a 7: o = orig()
./a.py a 8: o.a()
わかった。クラスが作成され、インスタンス化され、何らかの出力が発生します。 aインポートが完了しました。bfrom インポートを使用したため、それは良いことです。つまりorig、今までに存在する必要があることを意味します。そうしないと、インポートが失敗します。
./b.py b 2: orig.test=lambda self: print("wrong")
bモンキーパッチa.orig(注;ありません__main__.orig)。 bこれでインポートも完了です。
./a.py __main__ 2: class orig:
./a.py __main__ 3: def test(self):
./a.py __main__ 4: print("hello")
./a.py __main__ 5:
./a.py __main__ 6:
./a.py __main__ 7: o = orig()
./a.py __main__ 8: o.a()
__main__クラスを定義し、それをインスタンス化し、いくつかの出力を出力しています。また、これは変更された b__main__.origではなく、class の定義であることに注意してください。a.orig
混乱が解消されることを願っています。