Pythonでモジュールを作成する方法

ここではモジュールの利用方法及び使用上の注意点について説明します。

自作プログラムをライブラリ化して再利用することによって、効率的に開発を行うことができます。

複数のライブラリを名前の衝突なく利用するために、Pythonではモジュールを使います。

モジュールの作成

Pythonでは、一つのプログラムファイルが一つのモジュールに相当します。

作成したモジュールは、import文を使って他のプログラムファイルから再利用することができます。

次のような簡単なモジュールを作ってみましょう。

(testModule.py)

class Test:
	def sayStr(self, str):
		print str

if __name__ == '__main__': #testModule.pyを実行すると以下が実行される(モジュールとして読み込んだ場合は実行されない)
	a = Test()
	a.sayStr("Hello") #Hello

普通にPythonスクリプトとして実行すると以下の結果が得られます。

Hello

import文を使ってモジュールをインポートする

作成したモジュールは他のプログラムファイルからimport文でインポート(取り込む)することができます。

(importModule.py)

import testModule      #モジュールをインポート
a = testModule.Test()
a.sayStr("Hello")      #Hello

このように、モジュールをインポートするためには

import モジュール名

と記述します。ファイル名の拡張子 .py は不要です。

また、import文はプログラムの2行目以降どこに記述しても構いません。

ここではインポートしたモジュールからクラスを生成しています。

この場合、

モジュール名.クラス名

のように、モジュール名を先頭につけます。

関数、変数も同様に、モジュール名.関数名、モジュール名.変数名のように記述します。

クラスを作る度にモジュール名を記述するのが面倒だという場合は、次のようにfrom文を使うことでモジュール名を記述する必要がなくなります。

from testModule import Test
a = Test()
a.sayStr("Hello")

from文を使う場合の書式は以下の通りです。

from モジュール名 from クラス名

モジュールを扱う上でのワンポイント

  • testModule.pyをスクリプトとして普通に実行した場合、if __name__ == '__main__': の__name__変数は自動的に文字列'__main__'に置き換えられ、それ以降のブロックを実行します。

  • 他のプログラム(importModule.py)からtestModule.pyをインポートした場合、__name__は'testModule'に置き換えられ、if __name__ == '__main__': のブロックは実行されません。

  • これを利用して、モジュールを作成する際にはモジュールの使い方を注釈代わりにif __name__ == '__main__':以下に記述することがあります。

  • モジュールはインポートされると同時に実行されてしまいます。
    例えば、
def add(a, b):
	print a + b
	
add(2, 3)

というモジュールをインポートすると、自動的にadd(2, 3)が実行されてしまいます。

そこで、if __name__ == '__main__': を使ってモジュールとして読み込まれているかを判定します。

if __name__ == '__main__':
	add(2, 3)

このように記述することで、プログラムをスクリプトとして実行した場合はadd(2, 3)が実行されますが、モジュールとしてインポートした場合は実行されません。

標準ライブラリ

自作のモジュールだけではなく、Pythonでは様々な標準ライブラリが用意されており、モジュールとしてインポートすることで効率的に開発を行うことができます。