Pythonのインスタンス変数とクラス変数の違い!selfの使い方を初心者向けに徹底解説
生徒
「Pythonのクラスを使っていたら、selfを付ける変数と付けない変数があって混乱しました。何が違うんですか?」
先生
「それはインスタンス変数とクラス変数の違いですね。役割がまったく違う変数なんです。」
生徒
「名前も難しそうですし、プログラミング未経験でも理解できますか?」
先生
「大丈夫です。身近な例えを使って、selfの意味から順番に説明していきましょう。」
1. 変数には種類がある
Pythonでは「変数」という言葉がよく出てきます。 変数とは、文字や数字などのデータを一時的に入れておく箱のようなものです。
オブジェクト指向プログラミングでは、この変数にも種類があります。 クラスの中で使われる変数は、大きく分けて インスタンス変数とクラス変数の二つです。
この違いを理解することが、PythonのOOPを理解する大きな一歩になります。
2. selfとは何かを先に理解しよう
インスタンス変数を理解する前に、 まずselfについて知る必要があります。 selfは「そのオブジェクト自身」を表す特別な言葉です。
例えば、クラスから二人の人を作ったとします。 そのとき、それぞれが「自分の名前」を持っています。 この「自分」を指す言葉がselfです。
Pythonでは、クラスの中で 「このオブジェクト専用の情報」を扱うときに必ずselfを使います。
3. インスタンス変数とは何か
インスタンス変数とは、 オブジェクトごとに別々の値を持つ変数のことです。 クラスから作られた一つ一つの実物に紐づいています。
人で例えると、名前や年齢のようなものです。 同じ「人」という設計図から作られていても、 名前や年齢は一人一人違います。
Pythonでは、インスタンス変数は
self.変数名という形で定義します。
4. インスタンス変数の基本例
class Person:
def __init__(self, name):
self.name = name
この例では、nameがインスタンス変数です。 self.nameと書くことで、 「この人専用の名前」を保存しています。
person1 = Person("たろう")
person2 = Person("はなこ")
print(person1.name)
print(person2.name)
たろう
はなこ
同じクラスから作られていますが、 それぞれ違う値を持っていることが分かります。
5. クラス変数とは何か
次にクラス変数です。 クラス変数は、クラス全体で共有される変数です。
どのオブジェクトから見ても同じ値になります。 一つのクラスに一つだけ存在するイメージです。
例えるなら、学校の校歌のようなものです。 生徒は違っても、校歌は全員共通です。
6. クラス変数の基本例
class Person:
species = "人間"
def __init__(self, name):
self.name = name
speciesがクラス変数です。 selfを付けず、クラスの中に直接書かれています。
person1 = Person("たろう")
person2 = Person("はなこ")
print(person1.species)
print(person2.species)
人間
人間
どのオブジェクトから見ても、 同じ値が使われていることが分かります。
7. インスタンス変数とクラス変数の決定的な違い
インスタンス変数は「一人一人専用」、 クラス変数は「全員共通」という違いがあります。
selfが付くかどうかは、 「そのデータが誰のものか」を表しています。
selfが付いていればオブジェクト専用、 selfが付いていなければクラス全体のもの、 という考え方を覚えておくと混乱しません。
8. selfを正しく使う理由
Pythonでselfを使う理由は、 複数のオブジェクトを同時に扱うためです。
selfがないと、 どのオブジェクトの情報なのか分からなくなります。 selfは、Pythonが迷わないための目印です。
初心者のうちは難しく感じますが、 「自分自身を指す言葉」と考えると理解しやすくなります。