結論から言うと、インスタンスはクラスから作られる実体であり、属性はその実体ごとに持つデータです。

Pythonでクラスを学び始めると、インスタンスと属性の違いが少し混ざりやすいです。
クラスから複数のオブジェクトを作れることは理解していても、「どの値がどこに保存されるのか」が曖昧だと、コードを読みづらく感じます。
この記事では、インスタンスと属性の関係を、動くコードと一緒に整理します。

この記事でわかること

  • インスタンスと属性の役割の違い
  • 同じクラスから作っても値は別々に持てる理由
  • self を通して属性を扱う基本

完成コード

完成コードは次の通りです。

class Member:
    def __init__(self, name, points):
        self.name = name
        self.points = points

    def add_points(self, value):
        self.points += value

    def build_summary(self):
        return f"{self.name}さんの保有ポイントは {self.points} 点です。"


member_a = Member("佐藤", 120)
member_b = Member("田中", 80)

member_a.add_points(30)

print(member_a.build_summary())
print(member_b.build_summary())

コードのポイント

このコードでは、同じ Member クラスから2つのインスタンスを作っています。

  • member_amember_b は別々のインスタンスです
  • namepoints は各インスタンスが持つ属性です
  • member_a のポイントを増やしても、member_b の値は変わりません

同じ設計図から作られていても、インスタンスごとに状態を持てるところがクラスの基本です。

コードを順番に説明します

主要な処理を分けて説明します。

1. クラスは共通の設計図で、インスタンスは実際に使う対象です

class Member:
    def __init__(self, name, points):
        self.name = name
        self.points = points

Member は、会員情報を表すための設計図です。
そこから Member("佐藤", 120) のように作られたものがインスタンスです。

クラスだけを書いても、まだ実際の会員データは存在しません。
インスタンスを作ってはじめて、具体的な名前やポイントを持つ対象として使えるようになります。

2. 属性はインスタンスごとに持つデータです

member_a = Member("佐藤", 120)
member_b = Member("田中", 80)

この2行では、同じクラスから2つのインスタンスを作っています。
member_a には name="佐藤"points=120 が入り、member_b には別の値が入ります。

ここで大切なのは、属性はクラス全体で1つだけ共有されているのではなく、各インスタンスの中にそれぞれ入るという点です。
そのため、別の会員を作っても前の会員の情報が上書きされるわけではありません。

3. self はそのインスタンス自身を指しています

    def add_points(self, value):
        self.points += value

    def build_summary(self):
        return f"{self.name}さんの保有ポイントは {self.points} 点です。"

メソッドの中で使っている self は、そのメソッドを呼び出したインスタンス自身を表します。
member_a.add_points(30) を実行すると、selfmember_a を指します。

そのため、self.points += valuemember_a のポイントだけを増やします。
どのインスタンスの属性を操作しているのかを示す役割として、self が重要になります。

実務で使うときのポイント

実務では、インスタンスごとに状態を分けて持てることが、クラスを使う大きな理由になります。

  • ユーザー、商品、タスク、設定のように複数件を扱う対象は、インスタンスごとに属性を持たせると整理しやすいです
  • 同じ処理でも、どのインスタンスに対して実行するかで結果が変わる場合はメソッドが役立ちます
  • self が何を指しているかを意識すると、属性の更新先を追いやすくなります
  • 変数名だけで管理するより、対象ごとに状態をまとめたほうが保守しやすいです

たとえば業務ツールでは、複数の顧客情報や複数のファイル処理結果を扱う場面があります。
そうしたときに、インスタンスごとに属性を持たせると、対象ごとの状態を安全に扱いやすくなります。

よくある勘違い・注意点

  • クラスを書いただけでは実体はなく、インスタンスを作ってはじめて使えます
  • 属性は各インスタンスごとに持つため、片方を変更しても別のインスタンスには自動で反映されません
  • self は特別な予約語ではありませんが、慣例として必ず self を使います
  • インスタンスと属性の関係が曖昧なまま書くと、どの値を更新しているのか追いにくくなります

まとめ

  • インスタンスはクラスから作られる実体で、属性はその実体ごとのデータです
  • 同じクラスから複数作っても、属性の値はそれぞれ独立して持てます
  • メソッド内の self は、処理対象のインスタンス自身を指しています
  • 実務では、対象ごとに状態をまとめて管理したいときにクラスが役立ちます

次の記事