目次
1.モジュール紹介
プログラムをモジュール化すると、プログラムの組織構造が明確になり、保守が容易になります。モジュールを使用すると、コードの再利用性が保証されるだけでなく、プログラムの構造と保守性も向上します。カスタムモジュールだけでなく、ビルトインモジュールやサードパーティモジュールが提供する既製の関数もインポートできるので、プログラミングの効率が大幅にアップし、「ホイールの作成を繰り返さない」という考え方も反映されています。
第二に、モジュールの使用
2.1 インポート
#文件名:foo.py
x=1
def get():
print(x)
def change():
global x
x=0
class Foo:
def func(self):
print('from the func')
foo.py の関数を別の py ファイルで参照したい場合は、 import foo を使用する必要があります. モジュールを初めてインポートするときは、次の 3 つのことを行います:
1. ソース ファイル コードを実行する
2.ソースファイルの実行中に生成された名前を格納するための新しい名前空間を生成します
3. 新しく作成されたモジュールの名前空間を指す、現在の実行ファイルが配置されている名前空間で名前 foo を取得します. モジュールの名前空間で名前を参照したい場合は、次のようにプレフィックスを追加する必要があります.続く
import foo #导入模块foo
a=foo.x #引用模块foo中变量x的值赋值给当前名称空间中的名字a
foo.get() #调用模块foo的get函数
foo.change() #调用模块foo中的change函数
obj=foo.Foo() #使用模块foo的类Foo来实例化,进一步可以执行obj.func()
モジュールが初めてメモリ空間にロードされたこと、およびその後の繰り返しインポートがメモリ内の既存のモジュールを直接参照し、ファイルを繰り返し実行しないことを強調する必要があります。 sys.modules は、既にメモリにロードされているモジュールの名前を表示できます。
#在Python中模块也属于第一类对象,可以进行赋值、以数据形式传递以及作为容器类型的元素等操作。
2.2インポートから
from...import ステートメントは基本的に同じです。唯一の違いは、 import foo を使用してモジュールをインポートした後、参照モジュール内の名前に foo. というプレフィックスを付ける必要があり、 from foo import を使用してモジュール内の名前にアクセスすることです。参照モジュール foo、次のように
from foo import * #把foo中所有的名字都导入到当前执行文件的名称空间中,在当前位置直接可以使用这些名字
a=x
get()
change()
obj=Foo()
モジュール内であまりにも多くの名前を参照する必要がある場合は、上記のインポート形式を使用してコードを節約する効果を得ることができますが、強調すべき点の 1 つは、モジュールのトップレベルでのみインポートできることです。つまり、ソースファイルから現在の場所にどの名前がインポートされているかを判断できず、現在の名前と競合する可能性が非常に高くなります。位置。モジュールの作成者は、自分のファイルで _all_ 変数を定義して、* の意味を制御できます。
#foo.py
__all__=['x','get'] #该列表中所有的元素必须是字符串类型,每个元素对应foo.py中的一个名字
x=1
def get():
print(x)
def change():
global x
x=0
class Foo:
def func(self):
print('from the func')
このように、別のファイルで * import を使用すると、_all_ で定義された名前のみをインポートできます。
2.3として
import foo as f #为导入的模块foo在当前位置起别名f,以后再使用时就用这个别名f
f.x
f.get()
通常, インポートされた名前が長すぎる場合, コードを単純化するためにエイリアスが使用されます. さらに, インポートされた名前にエイリアスを設定すると, 現在の名前との競合を避けることができます. もう1つの重要な点は, 呼び出すメソッドの一貫性を保つことができることです.たとえば, load メソッドを同時に実装する json と pickle の 2 つのモジュールがあります. 関数は開いているファイルから構造化されたデータを解析することですが, 解析の形式は異なります. 次のコードを使用して, 異なるものを選択的にロードできます.モジュール
if data_format == 'json':
import json as serialize #如果数据格式是json,那么导入json模块并命名为serialize
elif data_format == 'pickle':
import pickle as serialize #如果数据格式是pickle,那么导入pickle模块并命名为serialize
data=serialize.load(fn) #最终调用的方式是一致的
2.4 検索モジュールのパスと優先度
モジュールのインポート時、モジュールがメモリにロードされている場合は直接参照され、それ以外の場合は組み込みモジュールが最初に検索され、次に sys.path で定義されたパスが左から順に検索されます。モジュールに対応するファイルが見つかるまで、それ以外の場合は例外がスローされます。sys.path はモジュール検索パスとも呼ばれ、リスト型です
通常、sys.path の最初のパスは空であり、実行可能ファイルが配置されているパスを表します。そのため、インポートされたモジュールと実行可能ファイルが同じディレクトリにある場合、インポートされたモジュールと実行可能ファイルについては、通常どおりインポートする必要があります。パスが異なる場合でも、モジュールに対応するソース ファイルが確実に見つかるようにするために、ソース ファイル foo.py が配置されているパスを sys.path に追加する必要があります。 foo.py は /pythoner/projects/ にあります
2.5 py ファイルの 2 つの用途を区別する
Python ファイルには 2 つの目的があります. 1 つはメイン プログラム/スクリプトとして実行され, もう 1 つはモジュールとしてインポートされます. 同じファイルの異なる目的を区別するために, 各 py ファイルには組み込みの _name_ 変数があります. pyファイルは、スクリプトとして実行すると「_main_」という値が割り当てられ、pyファイルをモジュールとしてインポートすると、モジュール名が割り当てられます
#foo.py
...
if __name__ == '__main__':
foo.py被当做脚本执行时运行的代码
else:
foo.py被当做模块导入时运行的代码
通常、if のサブコード ブロックにモジュール関数のテスト コードを記述して、foo.py をスクリプトとして実行するとテスト コードが実行されるようにしますが、モジュールとしてインポートする場合はテスト コードを実行する必要はありません。テストコードを実行します。