__init__とインスタンス変数
このレッスンでは、__init__ を書いて、インスタンスを作った時点で必要な値がそろっている状態にできるようになります。
作りっぱなしをやめる
前のレッスンでは Expense() で器を作ったあと、外から milk.name = "牛乳" と属性を足しました。この書き方だと、価格を入れ忘れたインスタンスが平気で作れてしまいます。使う側で expense.price を読んだところで初めて落ちるので、原因の場所も遠くなります。
Python には、インスタンスが作られた直後に自動で呼ばれる __init__ という特別なメソッドがあります。ここで属性を入れておけば、作った時点で値がそろっていることが保証されます。
from datetime import date
class Expense:
def __init__(self, name, price, day):
self.name = name
self.price = price
self.day = day
milk = Expense("牛乳", 158, date(2026, 8, 1))
print(milk.name, milk.price) # 牛乳 158Expense("牛乳", 158, date(2026, 8, 1)) と書くと、__init__ が呼ばれて3つの属性が入ります。前後のアンダースコア2本は「Python が決められた場面で自動的に呼ぶ名前」という印で、自分から milk.__init__() と呼ぶことはありません。
self は作られた本人
__init__ の第1引数 self は、いま作られているインスタンス本人です。self.name = name は「この本人の name 属性に、引数の name を入れる」という意味になります。呼ぶ側は self を渡しません。Python が自動で渡してくれます。
self という名前は決まりではなく慣習ですが、Python のコードはほぼ例外なく self と書きます。読む人が迷わないよう、あわせておきましょう。
属性の初期値も書ける
引数を受け取らずに固定値を入れることもできます。次のレッスンで足すメソッドのために、たとえば分類の初期値を持たせておく、といった使い方ができます。
class Expense:
def __init__(self, name, price, day):
self.name = name
self.price = price
self.day = day
self.category = "未分類"これで「品名・金額・日付を必ず持つ支出」という型ができました。
要件
- init で self.name / self.price / self.day の3つを設定すること
- expense_summary は Expense を作り、その属性から文字列を組み立てて返すこと
- 日付・品名・金額を半角スペースで区切り、金額の後ろに円を付けること
入出力例
expense_summary("牛乳", 158, "2026-08-01") → "2026-08-01 牛乳 158円"
expense_summary("電車代", 420, "2026-08-02") → "2026-08-02 電車代 420円"