クラス定義
このレッスンでは、class 文で自分だけの型を定義し、そこからインスタンスを作れるようになります。
辞書で持っていた支出をクラスにする
第2章から第6章まで、支出1件はずっと辞書やタプルで持ってきました。{"name": "牛乳", "price": 158} のような形です。動きはしますが、キーの綴りを間違えても実行するまで気づけません。「税込金額を出す」といった処理も、データとは別の場所に散らばったままです。
この章では、支出というデータと、支出に対する処理をひとまとめにした Expense という型を自分で作り、家計簿を辞書ベースからクラスベースへ移していきます。その第一歩が class 文です。
class は設計図、インスタンスは実物
クラスは「こういう形のものを作る」という設計図です。設計図から作った実物のことをインスタンス、またはオブジェクトと呼びます。
class Expense:
pass
milk = Expense()
print(type(milk).__name__) # Expenseclass Expense: で設計図を宣言し、Expense() と呼ぶと実物が1つできます。pass は「中身はまだ書かない」という意味の文で、クラスの中を空にしたいときの置き場所です。
属性にデータを持たせる
インスタンスにドットでくっつけた変数を属性と呼びます。辞書のキーに近いものですが、milk.name のように書けます。
milk = Expense()
milk.name = "牛乳"
milk.price = 158
print(milk.name, milk.price) # 牛乳 158インスタンスはそれぞれ別の入れ物なので、bread = Expense() を作って bread.name を入れても milk.name は影響を受けません。ここが辞書を毎回コピーしていた頃との違いです。
なお、このように外から属性を1つずつ足すやり方は、書き忘れが起きやすい書き方です。次のレッスンで __init__ を使い、作った時点で必ず値が入っている形に直します。今回はまず、クラスから実物を作って属性を読み書きする感覚をつかんでください。
要件
- Expense クラスからインスタンスを1つ作ること
- 作ったインスタンスに name と price の属性を入れること
- 属性を読んで「牛乳 158円」の形の文字列を返すこと
入出力例
make_expense_label("牛乳", 158) → "牛乳 158円"
make_expense_label("トマト", 240) → "トマト 240円"ヒント
編集 LuaGate編集部