結論から言うと、インスタンスはクラスから作られる実体であり、属性はその実体ごとに持つデータです。
Pythonでクラスを学び始めると、インスタンスと属性の違いが少し混ざりやすいです。
クラスから複数のオブジェクトを作れることは理解していても、「どの値がどこに保存されるのか」が曖昧だと、コードを読みづらく感じます。
この記事では、インスタンスと属性の関係を、動くコードと一緒に整理します。
この記事でわかること
完成コード
完成コードは次の通りです。
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_aとmember_bは別々のインスタンスですnameとpointsは各インスタンスが持つ属性ですmember_aのポイントを増やしても、member_bの値は変わりません
同じ設計図から作られていても、インスタンスごとに状態を持てるところがクラスの基本です。
コードを順番に説明します
主要な処理を分けて説明します。
1. クラスは共通の設計図で、インスタンスは実際に使う対象です
class Member:
def __init__(self, name, points):
self.name = name
self.points = pointsMember は、会員情報を表すための設計図です。
そこから 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) を実行すると、self は member_a を指します。
そのため、self.points += value は member_a のポイントだけを増やします。
どのインスタンスの属性を操作しているのかを示す役割として、self が重要になります。
実務で使うときのポイント
実務では、インスタンスごとに状態を分けて持てることが、クラスを使う大きな理由になります。
- ユーザー、商品、タスク、設定のように複数件を扱う対象は、インスタンスごとに属性を持たせると整理しやすいです
- 同じ処理でも、どのインスタンスに対して実行するかで結果が変わる場合はメソッドが役立ちます
selfが何を指しているかを意識すると、属性の更新先を追いやすくなります- 変数名だけで管理するより、対象ごとに状態をまとめたほうが保守しやすいです
たとえば業務ツールでは、複数の顧客情報や複数のファイル処理結果を扱う場面があります。
そうしたときに、インスタンスごとに属性を持たせると、対象ごとの状態を安全に扱いやすくなります。