モジュール化とパッケージ設計【コードを整理する力を身につける】

学び・スキルアップ

クラスを学んでくると、ファイルが長くなり、
「どこに何を書いたかわからない…😵‍💫」という状態になりがちです。

ここで必要になるのが、
「モジュール」「パッケージ」 というPythonの仕組み。
これは「コードを分けて整理するためのルール」です。


📦 モジュールとは?

モジュールとは、Pythonファイル(.py)1つ のこと。
つまり、自作した .py ファイルを他のスクリプトで読み込んで使えるようにしたものです。


🔹 例:モジュールを作る

1️⃣ まず calculator.py というファイルを作成します。

# calculator.py

def add(a, b):
    return a + b

def sub(a, b):
    return a - b

2️⃣ そして、別のファイル main.py からこのモジュールを使います。

# main.py

import calculator

print(calculator.add(5, 3))
print(calculator.sub(10, 4))

出力:

8
6

💡 import ファイル名 で同じフォルダ内のモジュールを読み込めます。
.py は書かないのがルールです。


📚 モジュールから特定の関数だけを読み込む

必要な関数だけを読み込むこともできます。

from calculator import add

print(add(2, 3))

出力:

5

💡 from ... import ... は、
大きなモジュールから必要な関数だけをピンポイントで使うときに便利。


🧩 モジュールのエイリアス(別名)

モジュール名が長いときは、短くできます。

import calculator as calc

print(calc.add(10, 20))

出力:

30

💡 NumPyをnp、Pandasをpdと略すのも同じ仕組みです。


📁 パッケージとは?

パッケージとは、モジュールをまとめたフォルダ構造 のことです。

構成イメージ👇

my_app/
├── __init__.py
├── calculator.py
└── ledger/
    ├── __init__.py
    └── budget.py

💡 __init__.py があるフォルダは「パッケージ」として扱われます。


🔹 例:パッケージ内のモジュールを使う

ledger/budget.py の中身:

def total_expense(expenses):
    return sum(expenses)

main.py

from ledger.budget import total_expense

print(total_expense([2000, 3500, 1200]))

出力:

6700

💡 ドット(.)で「階層構造」を表現します。
つまり ledger フォルダ内の budget.py を指定しています。


⚙️ 相対インポートと絶対インポート

複数のファイルが同じパッケージ内にあるとき、
他のモジュールを呼び出す方法 は2種類あります。

✅ 絶対インポート(推奨)

from my_app.calculator import add

フォルダの最上位から順番に指定します。
明示的で分かりやすい書き方です。


⚙️ 相対インポート(内部専用)

from .calculator import add

.(ドット)は「同じフォルダ」、.. は「1つ上の階層」を意味します。
ただし大規模開発では絶対インポートを使う方が安全です。


🧠 応用:再利用可能な構造にする

たとえば、これまで作った家計簿アプリを
次のように分けると、保守性がグッと上がります。

ledger_app/
├── __init__.py
├── models/
│   ├── __init__.py
│   ├── transaction.py
│   └── ledger.py
└── main.py

transaction.py

class Transaction:
    def __init__(self, date, category, amount):
        self.date = date
        self.category = category
        self.amount = amount

ledger.py

from .transaction import Transaction

class Ledger:
    def __init__(self):
        self.transactions = []

    def add(self, transaction):
        self.transactions.append(transaction)

main.py

from models.ledger import Ledger
from models.transaction import Transaction

ledger = Ledger()
ledger.add(Transaction("2025-10-01", "給料", 300000))
ledger.add(Transaction("2025-10-02", "食費", -2000))

for t in ledger.transactions:
    print(t.category, t.amount)

出力:

給料 300000
食費 -2000

💡 このように分けると、「機能ごとの責任範囲」が明確になります。


📦 pipで自作パッケージをインストールする(応用)

自分の作ったモジュールを「pip install」で使いたい場合、
setup.py を用意して配布できます。

from setuptools import setup, find_packages

setup(
    name="ledger_app",
    version="0.1",
    packages=find_packages(),
)

これで次のようにインストール可能になります。

pip install .

💡 ここまでくると、Pythonの「ライブラリを配布する」仕組みの入り口です。


🧠 まとめ

概念内容
モジュール.py ファイル1つ。importして再利用可能。
パッケージモジュールをまとめたフォルダ。__init__.py が必要。
絶対インポート明確にフォルダ階層を指定する安全な方法。
相対インポート同じパッケージ内での呼び出しに使う。
再利用性の向上大規模開発に向けて整理しやすくなる。

🚀 まとめ:これでプロレベルの構造に!

  • ✅ クラス → 機能を整理する単位
  • ✅ モジュール → ファイル単位で機能を分ける
  • ✅ パッケージ → 構造全体をまとめる単位
  • ✅ 最終的に「アプリ」として動く構造が完成!

コメント