つくる クラスベース化

このレッスンでは、新しい文法を足さずに、第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円 ...

要件

  1. クラス変数 TAX_RATE を 0.1 で持ち、total が int(self.price * (1 + Expense.TAX_RATE)) を返すこと
  2. str は「08/01 牛乳(食費) 173円」の形にすること
  3. rows を内包表記で Expense のリストに変換すること
  4. カテゴリ別合計は税込金額を足し、カテゴリ名を sorted の順に出すこと
  5. 税込金額が 500 円以上の品名を、読点で連結して1行で出すこと

入出力例

出力: "=== 明細 === 08/01 牛乳(食費) 17308/01 電車代(交通費) 46208/02 トマト(食費) 26408/03 書籍(教養) 1760=== カテゴリ別 === 交通費 462教養 1760食費 437=== 500円以上 === 書籍"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.py
学習モード

メモ

つくる クラスベース化

⌘S で保存