つくる クラスベース化
このレッスンでは、新しい文法を足さずに、第7章で覚えた道具だけで家計簿をクラスベースに作り直します。
辞書ベースからの卒業
第6章まで、支出1件は ["牛乳", 158, "食費"] のようなリストや、キー付きの辞書でした。今回はそれを入り口だけに残し、読み込んだ直後に Expense へ変換します。以降の集計も表示も、すべて属性とメソッドで書きます。データの持ち方が1か所に決まるので、あとから項目を足すときに直す場所も1か所で済みます。
使う道具は次のとおりです。
@dataclassでフィールドを宣言し、__init__を自動で作る- クラス変数
TAX_RATEで税率を共有する - メソッド
totalで税込金額を出す __str__で1行の表示を決める- 内包表記で生データを Expense に変換し、条件で絞り込む
dataclass の中のクラス変数
@dataclass を付けたクラスでは、型ヒントの付いた変数だけがフィールドになります。TAX_RATE = 0.1 のように型ヒントを書かない代入は、フィールドにはならず、ふつうのクラス変数として残ります。これはよく使う書き分けなので覚えておいてください。
出力の形
3つの見出しを挟んで、明細、カテゴリ別合計、500円以上の品名を順に出します。カテゴリの並び順は辞書の順ではなく sorted で決めてください。辞書に入れた順に頼ると、データの順番を変えたときに結果が変わってしまいます。
税込金額は必ず int() で整数に丸めてから足します。float のまま合計すると、462.00000000000006 のような値がそのまま画面に出ます。
見本
=== 明細 ===
08/01 牛乳(食費) 173円
...
=== カテゴリ別 ===
交通費 462円
...要件
- クラス変数 TAX_RATE を 0.1 で持ち、total が int(self.price * (1 + Expense.TAX_RATE)) を返すこと
- str は「08/01 牛乳(食費) 173円」の形にすること
- rows を内包表記で Expense のリストに変換すること
- カテゴリ別合計は税込金額を足し、カテゴリ名を sorted の順に出すこと
- 税込金額が 500 円以上の品名を、読点で連結して1行で出すこと
入出力例
出力: "=== 明細 ===
08/01 牛乳(食費) 173円
08/01 電車代(交通費) 462円
08/02 トマト(食費) 264円
08/03 書籍(教養) 1760円
=== カテゴリ別 ===
交通費 462円
教養 1760円
食費 437円
=== 500円以上 ===
書籍"ヒント
編集 LuaGate編集部