2

しばらく考えたのですが、これ以上のタイトルが思い浮かびません、すみません。

私は Python に不慣れで、(他の多くの人のように) 頭がよくわかりませんimport

「モジュール」と「パッケージ」、クラスと属性、その他すべてを理解していると思います。これは、明確にする必要がある特定の動作の 1 つです。

ファイル foo.py があるとします。次の 1 行があります。

x = 1

別のファイルで「foo をインポート」すると、x を参照できます。そして、すばらしいことに、別のファイルで foo をインポートすると、これら 2 つのファイルで x を共有できるようになります。簡単にするために、クラスを議論から除外します。ファイル間で属性を共有する Pythonic の方法。

ここに質問があります: I のときimport foo、foo.py 自体が (より適切な比喩がないため)インタープリターによって 密かにインスタンス化されていると言っても過言ではありませんか?

モジュールでクラスを定義すると、それは従来のルールに従い、明示的に定義した場合にのみインスタンス化されることに気付きました。importしかし、グローバル名前空間で私のモジュールのインスタンスをインスタンス化するPython インタープリター (ステートメントを介して) は、属性共有動作を説明する唯一の方法です。

これは本当ですか?半真実?それとも、失われた国で Sleestaks と一緒にさまよっているのですか?

4

3 に答える 3

4

モジュールをインポートする場合:

  1. モジュールが以前にインポートされていない場合、ファイルはオブジェクトに解析されます。このオブジェクトは、pythonpath からモジュールへのインポート パスであるキーを使用してmodule追加されます。sys.modules
  2. そのモジュール オブジェクト (またはそのメンバー) は、インポートする名前空間でエイリアス化され、参照されるエイリアスとオブジェクトは、import使用した特定の形式によって決定されます。
そのため、インタープリターはその名前で登録されているものをimport fooチェックします。見つかった場合は、モジュールのローカル名前空間にラベルを提供します。そうでない場合は、モジュールが見つかるまで pythonpath を検索し、それをオブジェクトに解析し、そのオブジェクトを に追加し、そのモジュール オブジェクトのローカル名前空間にラベルを追加します。sys.modulesfoofoofoofoomodulesys.modules

import foo as foofは同じことを行いますが、作成されるローカル名前空間ラベルのみがfoof. モジュール から属性の名前空間にfrom foo import xラベルを提供する代わりに、ローカル名前空間にラベルと参照を作成するまでは同じプロセスに従います。2つのアイデアを組み合わせるだけです。xxfoofrom foo import x as foox

__module__クラスを使用すると、属性を使用してツリーを上下にクロールすることで、このシステム全体を実際に調べることができます。

于 2012-08-15T18:28:26.027 に答える
2

インポートにより、「モジュール」オブジェクトのインスタンスが作成されます。これは、モジュールが初めてインポートされたときにのみ作成されることを知っておく価値があります。次回インポートされると、オリジナルへの参照が取得されます。少し内省することで、その場で独自のモジュールオブジェクトを作成できます。

import glob  # Import any python module
moduleType = type(glob)

onTheFly = moduleType("OnTheFly", "Docstring for this module")

これらを作成することにはあまりメリットはありませんが。

于 2012-08-15T18:40:30.293 に答える
0

はい、確かにそうです。import fooモジュール オブジェクトを実行するfooと、インスタンスが作成され、クラス バーなどのファイルの内容がそのオブジェクトのメンバーとして追加されます。

于 2012-08-15T18:28:07.660 に答える