で行っているように、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
インポートが完了しました。b
from インポートを使用したため、それは良いことです。つまり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
混乱が解消されることを願っています。