Pythonのインスタンス変数とクラス変数の違い!selfの使い方を初心者向けに解説
生徒
「Pythonのクラスの中でselfをよく見かけるんですが、これって何ですか?インスタンス変数ってやつですか?」
先生
「selfはそのクラスから作られた“自分自身”のことを指すんだ。そして、インスタンス変数やクラス変数と一緒に使うことが多いんだよ。」
生徒
「えっ?クラス変数って何ですか?インスタンス変数とどう違うんですか?」
先生
「それはとても大事なポイントだね。じゃあ、インスタンス変数とクラス変数の違いと、selfの使い方をじっくり解説していこう!」
1. Pythonのインスタンス変数とは?自分専用のデータを保持する仕組み
Python(パイソン)のインスタンス変数とは、一言で言うと「作成されたオブジェクト(インスタンス)ごとに独立して保持される専用の変数」のことです。
オブジェクト指向プログラミングでは、クラスを「設計図」、インスタンスを「設計図から実体化した製品」に例えます。インスタンス変数は、その製品一つひとつに貼られた「固有のラベル」のような役割を果たします。同じ設計図から作られても、製品ごとにシリアル番号や色が違うように、インスタンス変数も個別に異なる値を持つことができるのです。
インスタンス変数を定義する際は、必ず self.変数名 という形式を使います。この self は「そのインスタンス自身」を指しており、これがあることで「これは私だけのデータだよ」とコンピュータに教えることができます。
class Car:
def __init__(self, color, owner):
# selfをつけることで、インスタンス変数として登録される
self.color = color # インスタンス変数(車の色)
self.owner = owner # インスタンス変数(持ち主)
# 同じCarクラスから、別々のデータを持つインスタンスを作成
car1 = Car("赤", "田中さん")
car2 = Car("青", "佐藤さん")
print(f"{car1.owner}の車の色は{car1.color}です。")
print(f"{car2.owner}の車の色は{car2.color}です。")
上記のコードでは、car1 と car2 という2つのインスタンスが作られています。self.color という名前は共通ですが、中身は「赤」と「青」というように、それぞれが独立した情報として保存されているのが分かりますね。
このように、個別の状態(プロパティ)を管理したい場合には、インスタンス変数の利用が不可欠となります。
2. クラス変数とは?インスタンス変数との違いをわかりやすく解説
Pythonのオブジェクト指向を学ぶ上で、避けて通れないのが「クラス変数」です。前項で触れたインスタンス変数が「個別のデータ」を扱うのに対し、クラス変数は「そのクラスから作られるすべてのインスタンスで共有されるデータ」を管理するために使います。
例えば、ゲームのキャラクターを作るとき、「名前」や「体力」は個別に違いますが、「重力の設定」や「種族名」など、全員に共通するルールはクラス変数で定義するのが効率的です。これにより、メモリの節約やコードの管理が格段に楽になります。
クラス変数は、クラスの直下(メソッドの外側)で定義します。
class Animal:
# クラス変数:すべての動物で共通
species = "動物"
def __init__(self, name):
# インスタンス変数:それぞれの名前は違う
self.name = name
# 2つのインスタンスを作成
dog = Animal("ポチ")
cat = Animal("タマ")
# クラス変数はどちらからアクセスしても同じ値
print(f"{dog.name}は{dog.species}です。")
print(f"{cat.name}は{cat.species}です。")
上記のサンプルプログラムでは、speciesという変数がクラス変数です。dog(ポチ)もcat(タマ)も、同じAnimalクラスから生まれた仲間なので、共通して「動物」というデータを持っています。もし途中でクラス変数の値を書き換えれば、すべてのインスタンスにその変更が反映されるという特徴があります。
このように、「個別の情報(インスタンス変数)」と「共通のルール(クラス変数)」を使い分けることが、スッキリとしたPythonプログラムを書くための第一歩です。
3. 実際にインスタンス変数とクラス変数を使ってみよう
ここで、インスタンス変数とクラス変数の違いを具体的に見てみましょう。
class Animal:
species = "動物" # クラス変数
def __init__(self, name):
self.name = name # インスタンス変数
a1 = Animal("ライオン")
a2 = Animal("ゾウ")
print(a1.name)
print(a2.name)
print(a1.species)
print(a2.species)
ライオン
ゾウ
動物
動物
a1とa2は別々の名前(インスタンス変数)を持っていますが、species(クラス変数)は同じ値「動物」です。
4. クラス変数は全体共通、インスタンス変数は個別の情報
ここが一番大事なポイントです。インスタンス変数は「ひとりひとりの名札」、クラス変数は「制服の色」と考えると分かりやすいです。
- インスタンス変数:個別の情報(名前・年齢など)
- クラス変数:全体で共通の情報(カテゴリ・種別など)
もしクラス変数の値を変更すると、他のインスタンスにも影響があることに注意しましょう。
5. クラス変数を書き換えるとどうなる?
クラス変数をインスタンスから書き換えると、実は“そのインスタンスだけの変数”が新たに作られます。つまりクラス変数ではなくなります。
class Animal:
species = "動物"
def __init__(self, name):
self.name = name
a1 = Animal("キリン")
a2 = Animal("サイ")
a1.species = "哺乳類"
print(a1.species)
print(a2.species)
哺乳類
動物
a1.speciesを変えたつもりが、a1だけに新しい変数ができただけで、クラス変数は変わっていません。
6. selfの意味と役割を理解しよう
selfはPythonのクラスの中で「自分自身のこと」を指すキーワードです。
たとえばself.nameと書くと、「そのオブジェクト自身のname変数」を意味します。selfを使わずに変数を書いてしまうと、ローカル変数(関数の中だけで使われる変数)になってしまいます。
class Student:
def __init__(self, name):
name = name # これは間違い
s = Student("たかし")
print(s.name) # エラーになる
このように、selfをつけないと、クラスの外から使うことができません。正しくは以下のように書きます。
class Student:
def __init__(self, name):
self.name = name # 正しい
7. 実生活にたとえてもう一度整理しよう
Pythonのクラスを「学校のクラス」にたとえてみましょう。
- クラス変数:「みんなが3年1組である」という共通情報
- インスタンス変数:「名前・出席番号・性別」など一人ひとりの情報
- self:「私自身(たろうくん自身・はなこさん自身)」を表す
このようにイメージすると、変数の役割やselfの意味が自然と理解できるようになります。