コース一覧
    Pythonクラス・総合制作
    パッケージ構成に整理

    Pythonクラス・総合制作

    クラスと総合制作を学び、Pythonの知識を組み合わせた小さなプログラムを完成できるようにします。

    1
    クラス入門
    01. クラス定義15分
    02. __init__とインスタンス変数15分
    03. メソッド15分
    04. __str__15分
    05. クラス変数15分
    06. dataclass15分
    07. オブジェクトと内包表記15分
    08. つくる クラスベース化20分
    09. 第7章クイズ10分
    2
    総合制作
    01. パッケージ構成に整理20分
    02. 月次レポートv220分
    03. 動作チェックスクリプト20分
    04. 自由拡張20分
    05. 完成と次のステップ10分

    パッケージ構成に整理

    このレッスンでできるようになること

    1本のファイルに詰め込んでいた家計簿を、models と report に分けたパッケージの形に整理できるようになります。

    パッケージはフォルダにした module です

    第1章で、関数を別ファイルへ移して import することを学びました。ファイルが3本4本と増えてくると、今度はそのファイル自体が散らかります。そこで関係するファイルをフォルダにまとめ、フォルダごと import できるようにしたものがパッケージです。

    プレーンテキスト

    kakeibo/
        __init__.py
        models.py
        report.py

    __init__.py は「このフォルダはパッケージです」という目印のファイルです。中身は空で構いません。この形にしておくと、外からは次のように呼べます。

    Python

    from kakeibo.models import Expense
    from kakeibo.report import category_totals

    kakeibo.models の . は、フォルダの中のファイルを指しています。パスの区切りが . になっただけで、やっていることは第1章の自作 module の import と同じです。

    どう分けるかは責務で決めます

    ファイル名で迷ったら、そのコードが何の役目を持っているかで分けます。今回の家計簿なら次の2つです。

    • models.py — データの形。第7章で作った Expense クラスを置きます
    • report.py — データを読んで数える処理。合計やカテゴリ別集計を置きます

    この分け方の良いところは、Expense に項目を1つ足したくなったときに models.py だけを開けばよく、集計の書き方を変えたくなったときは report.py だけを開けばよいことです。逆に「表示の関数と集計の関数が同じファイルに混ざっている」と、直したい場所を探すところから始まります。

    この演習では中身をコードで書き出します

    ふだんはエディタで models.py を作りますが、この学習環境ではファイルを1本しか書けません。そこで中身を文字列として持っておき、プログラムからファイルに書き出してから import します。

    Python

    from pathlib import Path
    
    MODELS_SRC = """from dataclasses import dataclass
    
    
    @dataclass
    class Expense:
        name: str
        amount: int
        category: str
        date: str
    """
    
    Path("kakeibo").mkdir(exist_ok=True)
    Path("kakeibo/models.py").write_text(MODELS_SRC, encoding="utf-8")

    mkdir(exist_ok=True) は、すでにフォルダがあってもエラーにしない書き方です。write_text は第6章の pathlib で出てきたものです。

    書き出した直後に import するときは、1行だけ添えるものがあります。

    Python

    import importlib
    importlib.invalidate_caches()

    Python は「どこにどのファイルがあるか」を一度調べたら覚えています。プログラムの実行中に新しく作ったフォルダは、その記憶に入っていません。invalidate_caches() はその記憶を捨てて、もう一度探し直させる命令です。この1行が無いと、たった今作ったばかりのパッケージが見つからず ModuleNotFoundError になります。

    新しい文法はここまでです。あとは第7章までの道具で中身を書くだけです。

    要件

    1. kakeibo フォルダを作り、init.py / models.py / report.py の3本を書き出す
    2. models.py に dataclass の Expense を定義する。属性は name, amount, category, date の4つ
    3. Expense に is_expensive メソッドを持たせる。amount が 1000 以上なら True を返す
    4. report.py に total_amount と category_totals を定義する。category_totals は Counter で返す
    5. 書き出したあと importlib.invalidate_caches() を呼んでから import する
    6. 支出は スーパー3200円食費, 電車代480円交通費, コンビニ850円食費, 技術書1600円教養 の4件を使う
    7. 1行目に 合計 6130円 の形で総額を表示する
    8. 2行目以降にカテゴリ名の昇順で 食費 4050円 の形で表示する
    9. 最後の行に 高額 2件 の形で is_expensive が True の件数を表示する

    ヒント

    module の中身は三重引用符の文字列で持つと、そのまま write_text に渡せます

    sorted(counter.items()) と書くとカテゴリ名の昇順で (名前, 金額) の組が取り出せます

    件数の数え方は len([e for e in expenses if e.is_expensive()]) です

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/08/07

    関連レッスン

    • 月次レポートv2

      カテゴリ別と前月比を出すレポートを、中級の道具で作ります。

    • 動作チェックスクリプト

      assert で主要機能の確認を自動化します。

    • 自由拡張

      検索や予算アラートなど、欲しい機能を1つ設計して足します。

    • 完成と次のステップ

      作ったものを振り返り、次に進む道を見通します。

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • 関数処理に名前を付けて再利用できる単位
    • クラスデータと振る舞いを束ねる単位
    • 処理計算や代入を表す長方形
    • dataclassboilerplate を減らすクラス定義の形
    • 属性インスタンス属性=各インスタンス固有の値(self.name)。
    • メソッドクラスに属する関数
    main.py
    エディタを読み込んでいます

    メモ

    パッケージ構成に整理

    ⌘S で保存