↓ メインコンテンツへスキップ
  1. 第07講 クラス(2/2)/

モジュール

モジュール
#

教科書 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
    # 第2引数の format_spec はフォーマット指定文字列です。
    # format_spec は format 関数などから渡されます。特に指定がなければ空文字列になります。
    def __format__(self, format_spec):
        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 と書きます。