つくる クラスベース化
このレッスンでは、新しい文法を足さずに、第7章で覚えた道具だけで家計簿をクラスベースに作り直します。
辞書ベースからの卒業
第6章まで、支出1件は ["牛乳", 158, "食費"] のようなリストや、キー付きの辞書でした。今回はそれを入り口だけに残し、読み込んだ直後に Expense へ変換します。以降の集計も表示も、すべて属性とメソッドで書きます。データの持ち方が1か所に決まるので、あとから項目を足すときに直す場所も1か所で済みます。
使う道具は次のとおりです。
@dataclassでフィールドを宣言し、__init__を自動で作る- クラス変数
TAX_RATEで税率を共有する - メソッド
totalで税込金額を出す __str__で1行の表示を決める- 内包表記で生データを Expense に変換し、条件で絞り込む
dataclass の中のクラス変数
@dataclass を付けたクラスでは、型ヒントの付いた変数だけがフィールドになります。TAX_RATE = 0.1 のように型ヒントを書かない代入は、フィールドにはならず、ふつうのクラス変数として残ります。これはよく使う書き分けなので覚えておいてください。
日付と変換の書き方を確認する
日付の表示は strftime で指定します。予定表なら次のように使えます。
Python
from datetime import date
meeting = date(2027, 4, 9)
print(meeting.strftime("%m/%d")) # 04/09%m は2桁の月、%d は2桁の日です。メソッドの中でも、日付の属性に同じ指定ができます。
複数の値を持つ行からインスタンスを作る書き方も確認します。次は図書のデータを変換する例です。
Python
from dataclasses import dataclass
@dataclass
class Book:
title: str
pages: int
records = [["星の本", 80], ["海の本", 120]]
books = [Book(title, pages) for title, pages in records]for の後ろで1行を値に分け、左端でその値をクラスに渡します。演習では1行に4つの値があります。
今回書く部分
税率、税込金額を返すメソッド、表示用のメソッド、インスタンスへの変換の4か所を担当します。明細表示・カテゴリ集計・高額抽出は完成済みのコードとして渡します。クラスに処理を置き、外側から属性やメソッドで使う流れに集中しましょう。
出力の形
3つの見出しを挟んで、明細、カテゴリ別合計、500円以上の品名を順に出します。カテゴリの並び順は辞書の順ではなく sorted で決めてください。辞書に入れた順に頼ると、データの順番を変えたときに結果が変わってしまいます。
税込金額は必ず int() で整数に丸めてから足します。float のまま合計すると、462.00000000000006 のような値がそのまま画面に出ます。
見本
=== 明細 ===
08/01 牛乳(食費) 173円
...
=== カテゴリ別 ===
交通費 462円
...要件
- クラス変数 TAX_RATE に税率 0.1 を設定する。型ヒントは付けない
- total は価格に税率分を加え、int で円未満を切り捨てた整数を返す
- str は「08/01 牛乳(食費) 173円」の形で、日付、品名、カテゴリ、total の戻り値を並べる
- rows の各行の name, price, category, day を受け取り、内包表記で Expense のリストを expenses に入れる
- 完成済みの表示と集計はそのまま使う。カテゴリ名の昇順で税込合計を出し、税込500円以上の品名を元の順で読点で連結する