__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) のように日付を決め打ちにしてください。実行した日によって出力が変わると、正しく書けているのか判断できなくなります。
要件
- str は「月/日 品名 金額円」の形の文字列を返すこと
- 月と日は strftime で 2 桁ゼロ埋めにすること
- expenses を順に for で回し、print(expense) で3行出力すること
入出力例
出力: "08/01 牛乳 158円
08/01 電車代 420円
08/02 トマト 240円"ヒント
編集 LuaGate編集部