English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Pythonの__init__.pyファイルの役割の詳細解説

__init__.pyファイルの役割は、フォルダをPythonモジュールに変換することです。Pythonの各モジュールのパッケージには、__init__.pyファイルがあります。

通常、__init__.pyファイルは空ですが、他の機能を追加することもできます。パッケージをインポートする際、実際にはその__init__.pyファイルをインポートしています。これにより、__init__.pyファイル内で必要なモジュールを一括でインポートすることができ、個別にインポートする必要がなくなります。

# package
# __init__.py
import re
import urllib
import sys
import os
# a.py
import package 
print(package.re, package.urllib, package.sys, package.os)

ここでは、__init__.pyファイル内の参照ファイルにパッケージ名を追加する必要があります。

__init__.pyには重要な変数、__all__があります。それはすべてのモジュールをインポートするために使用されます。

# __init__.py
__all__ = ['os', 'sys', 're', 'urllib']
# a.py
from package import *

この場合、__init__.pyファイルに登録された__all__リスト内のモジュールやパッケージが現在のファイルにインポートされます。

了解できますように、__init__.pyは主にパッケージのインポート動作を制御します。__init__.pyファイルの役割を明確に理解するには、import文の参照メカニズムについて詳細に確認する必要があります:

import文でインポートできるオブジェクトは以下のタイプです:

• モジュールファイル(.pyファイル)

• CまたはC++; エクステンション(共有ライブラリやDLLファイルにコンパイルされた)

• パッケージ(複数のモジュールを含む)

• 内部モジュール(Cで書かれ、Pythonインタープリタにリンクされた)

モジュールをインポートする際、インタープリタはインポートファイルを検索するためにsys.pathリスト内のディレクトリの順序に従います。

import sys
>>> print(sys.path)
# Linux:
['', '']/usr/local/lib/python3.4',
'/usr/local/lib/python3.4/プラットフォーム-sunos5',
'/usr/local/lib/python3.4/lib-tk',
'/usr/local/lib/python3.4/lib-dynload',
'/usr/local/lib/python3.4/site-packages'
# Windows:
['', 'C:\\WINDOWS\\system32\\python34.zip34\\DLLs34\\lib', 'C:\\Python34\\lib\\plat-win34\\lib\\lib-tk34\\Lib\\site-packages\\pythonwin34', 'C:\\Python34\\lib\\site-packages34\\lib\\site-packages\\win32', 'C:\\Python34\\lib\\site-packages\\win32\\lib', 'C:\\Python34\\lib\\site-packages\\wx-2.6-msw-unicode'

listの最初の要素の空文字列は、現在のディレクトリを表します。

.pycファイルと.pyoファイルについて

.pyファイルのアセンブリは、import文が実行されたときにのみ行われます。.pyファイルが最初にインポートされたとき、それがバイトコードにアセンブリされ、同じ名前の.pycファイルにバイトコードが書き込まれます。その後の各インポート操作は、直接.pycファイルを実行します(.pyファイルの変更日が変更された場合、新しい.pycファイルが生成されます)。インタープリタが使用する-Oオプションを使用すると、同名の.pyoファイルが使用されます。このファイルはアサーション(assert)、バックトラック情報、その他のデバッグ情報を取り除き、サイズが小さくなり、高速に実行されます。(使用-OOオプションを使用すると、生成される.pyoファイルはドキュメント情報を無視します()。

モジュールのインポート

モジュールは通常、独立した.pyファイルとして存在し、import文で直接参照できます。モジュールのファイル形式には.py、.pyo、.pyc、.pyd、.so、.dllがあります。

モジュールをインポートする際に、インタープリタは以下の作業を行います:

1. インポートされたモジュールの名前で新しい名前空間を作成し、その名前空間を通じてインポートされたモジュールの属性およびメソッドにアクセスできます。

2. 新しく作成された名前空間で源コードファイルを実行します。

3. 源コードファイルのオブジェクトを作成し、そのオブジェクトはモジュールの名前空間を参照します。このようにして、このオブジェクトを通じてモジュール内の関数および変数にアクセスできます。

import 文言はプログラムのどこでも使用できます。プログラム内で同じモジュールを複数回インポートすることもできますが、モジュール内のコードは最初にインポートされたときにのみ実行されます。後のimport文は、単にモジュール名空間への参照を作成するだけであります。

sys.modules辞書は、すべてのインポートされたモジュールのモジュール名とモジュールオブジェクトのマッピングを保存しています。

パッケージのインポート

関連するモジュールが一つのパッケージとして構成され、メンテナンスと使用を容易にし、名前空間の衝突を最小限に抑えることができます。一般的に、パッケージの構造は以下のようになります:

package
|- subpackage1
|- __init__.py
|- a.py
|- subpackage2
|- __init__.py
|- b.py

以下のいくつかのインポート方法があります:

import subpackage1.a # モジュールsubpackage.aをグローバル名前空間にインポートします。例えば、a中の属性にアクセスする場合はsubpackageを使用します1.a.attr
from subpackage1 import a # モジュールaをグローバル名前空間にインポートします。例えば、a中の属性にアクセスする場合はa.attr_aを使用します
from subpackage.a import attr_a # モジュールaの属性を名前空間に直接インポートします。例えば、a中の属性にアクセスする場合はattr_aを使用します 
from文を使うと、モジュールを現在の名前空間に直接インポートできます。from文は、インポートされたオブジェクトの名前空間を参照しません。代わりに、インポートされたオブジェクトを現在の名前空間に直接導入します。

以下は、編集者が皆さんに紹介するPythonの__init__.pyファイルの詳細な説明です。皆さんの助けになれば幸いです。何か疑問があれば、コメントを残してください。編集者は皆さんの質問に迅速に回答します。このサイトへのサポートに感謝しています!

声明:この記事の内容はインターネットから収集され、著作権者に帰属します。インターネットユーザーが自発的に貢献し、アップロードしたものであり、このウェブサイトは所有権を持ちません。人工的な編集は行われていません。著作権侵害の可能性のある内容が見つかった場合は、メールを送信して:notice#oldtoolbag.com(メールを送信する際には、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認がとれましたら、このサイトは即座に侵害される可能性のあるコンテンツを削除します。

おすすめ