__str__

このレッスンでは、__str__ を定義して、print したときの見た目を自分で決められるようになります。

そのまま print すると読めない

__init__ とメソッドがそろった Expense を、そのまま print してみると困ったことになります。

milk = Expense("牛乳", 158, date(2026, 8, 1)) print(milk)

出てくるのはクラス名とメモリ上の位置を並べただけの文字列で、品名も金額も見えません。デバッグのたびに print(milk.name, milk.price) と書き並べるのは面倒です。

__str__ は人が読む表示

クラスに __str__ メソッドを定義すると、print したときや str() に渡したときにその戻り値が使われます。

class Expense: def __init__(self, name, price, day): self.name = name self.price = price self.day = day def __str__(self): return f"{self.day.strftime('%m/%d')} {self.name} {self.price}円" print(Expense("牛乳", 158, date(2026, 8, 1))) # 08/01 牛乳 158円

戻り値は必ず文字列にします。数値を返すと TypeError になります。第1章で使った strftime をここで再利用すると、日付の書式もクラスの中に閉じ込められます。

__str____repr__ の違い

Python にはもう1つ __repr__ という似た名前があります。__str__ が「人が読むための表示」なのに対し、__repr__ は「開発者がデバッグで見るための表示」です。リストの中に入れて print したときは __repr__ のほうが使われるので、両方そろえておくと調査が楽になります。

def __repr__(self): return f"Expense({self.name!r}, {self.price})"

!r は、その値を __repr__ の形で埋め込む指定です。まずは __str__ を書けるようになれば十分です。

日付は固定して確かめる

学習中は date.today() ではなく date(2026, 8, 1) のように日付を決め打ちにしてください。実行した日によって出力が変わると、正しく書けているのか判断できなくなります。

要件

  1. str は「月/日 品名 金額円」の形の文字列を返すこと
  2. 月と日は strftime で 2 桁ゼロ埋めにすること
  3. expenses を順に for で回し、print(expense) で3行出力すること

入出力例

出力: "08/01 牛乳 15808/01 電車代 42008/02 トマト 240円"

ヒント

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

メモ

__str__

⌘S で保存