モジュール #
教科書 p.243(Lesson 8.7)これまでは,1つのファイルに1つの完結したプログラムを書いてきました. 一方で,クラスを記述するようになると,1つのクラスを複数のプログラムから利用したいという場面が出てきます. そのため,他のファイルを読み込んでプログラムを作成できるようになると便利です. Python では,他のファイルを読み込むための仕組みとして モジュール(Module) が用意されています.
モジュールの設定 #
モジュールを作成するには,Python のソースコードを .py
ファイルに保存します.
例えば,person.py
というファイルに以下のように Person
クラスを定義したとします.
# person.py
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __format__(self):
return f"{self.name} is {self.age} years old."
def __str__(self):
return f"{self.name} is {self.age} years old."
これで,person
モジュールが作成できました.
Python では,ファイル名から拡張子の.py
を取り除いたものがモジュールの名前になります.
このモジュールを利用する場合,同じディレクトリにある他のファイルから import
文を使って読み込むことができます.
なお,今回は Person
クラスを例に説明していますが,モジュールにはクラスだけでなく,関数や変数も定義できます.
また,Person
クラスを含むモジュールを作成する場合,必ずしもクラス名とモジュール名を同一にする必要はありません.
ただし,モジュール名から,どのような内容のクラス,関数が定義されているのかが想像できることが重要です.
モジュールの読み込み #
先ほど作成した person.py
と同じディレクトリに self_introduction.py
というファイルを置き,
次の内容を記述します.
import person # personモジュールを読み込む.
# self_introduction.py
p1 = person.Person("John Doe", 30) # person モジュールで定義された Person クラスを利用する.
print(p1) # John Doe is 30 years old.
p2 = person.Person("Jane Doe", 35)
print(p2) # Jane Doe is 35 years old.
このように,import
文を使って person
モジュールを読み込むことで Person
クラスを利用できるようになります.
ここではモジュール内のクラスを利用しましたが,モジュール内の関数や変数も同様に モジュール名.関数
と書くことで利用できるようになります.
モジュールの応用 #
教科書 p.248(Lesson 8.8)別名でインポートする #
モジュール名が長い場合や,他のモジュールと名前が被る場合など,モジュール名を別名でインポートすることができます.
別名でインポートする場合は,import
文の後に as
を使って別名を指定します.
別名は,自由に指定できますが,他のプログラマが読みやすい名前を選ぶようにしましょう.
import モジュール名 as 別名
先ほどの self_introduction.py
の import
文を import person as p
とすると,
これまで person.Person
と書いていた部分を p.Person
と書くことができます.
import person as p # person モジュールを p という名前で読み込む.
p1 = p.Person("John Doe", 30) # person モジュールで定義された Person クラスを利用する.
print(p1) # John Doe is 30 years old.
p2 = p.Person("Jane Doe", 35)
print(p2) # Jane Doe is 35 years old.
名前を直接インポートする #
モジュールを利用すると,person.Person
のように,モジュール名.クラス
と書く必要がありますが,
直接 クラス
と書きたい場合,from
文を使って特定のクラス,関数,変数を import
できます.
from モジュール名 import 名前(モジュール内のクラス,関数,変数など)
例えば,person.Person
と書く代わりに,Person
と書きたい場合は,次のように書きます.
from person import Person # person モジュールから Person クラスを直接読み込む.
p1 = Person("John Doe", 30) # person モジュールで定義された Person クラスを利用する.
print(p1) # John Doe is 30 years old.
p2 = Person("Jane Doe", 35)
print(p2) # Jane Doe is 35 years old.
なお,from
文を使う場合,import
する名前が他のモジュールと被る場合,as
を使って別名を指定することもできます.
from person import Person as P
とすると,Person
クラスを P
という名前で利用できます.
また,from person import *
とすると,person
モジュール内のすべてのクラス,関数,変数を読み込むことができます.
パッケージ分割 #
プログラムが大きくなると,複数のモジュールに分けて管理することがあります. それでもファイルが多くなりすぎた場合,パッケージに分けて管理することもできます. パッケージは,複数のモジュールをまとめたもので,ディレクトリ階層で表現します.
例えば,user/person.py
というファイルがある場合,person
モジュールが user
パッケージに置かれていることになります.
この場合,person
モジュールを読み込むには,import user.person
と書きます.
また,user
パッケージ内の person
モジュールから Person
クラスを読み込むには,from user.person import Person
と書きます.