クラスとインスタンスの関係がわかったところで、次は「インスタンス変数」と「クラス変数」という、二つの特別な「変数」について学ぼう。
これは、それぞれの「モノ(インスタンス)」が持っている特徴なのか、それとも「設計図(クラス)」自体が持っている特徴なのか、という違いなんだ。
「インスタンス変数」は、それぞれの「モノ(インスタンス)」が個別に持っている特徴のことだよ。
例えば、ゲームのキャラクターで考えてみよう。勇者と魔法使いは、それぞれ違う「体力」や「攻撃力」を持っているよね?これは、キャラクターごとに違うから、インスタンス変数として扱うんだ。
class Character:
# これは特別なメソッドで、インスタンスが作られるときに自動で動くんだ
def __init__(self, name, hp):
self.name = name # このキャラクターの名前
self.hp = hp # このキャラクターの体力
yusha = Character("勇者アキラ", 100)
mahoutsukai = Character("魔法使いリナ", 80)
print(yusha.name, yusha.hp) # 出力: 勇者アキラ 100
print(mahoutsukai.name, mahoutsukai.hp) # 出力: 魔法使いリナ 80
__init__
という特別な部分については後で詳しく説明するけど、ここでは「それぞれのキャラクターが別々の名前と体力を持っている」というところがポイントだよ。
それに対して「クラス変数」は、その「設計図(クラス)」から作られたすべての「モノ(インスタンス)」が共通して持っている特徴のこと。
例えば、すべてのキャラクターに共通する「ゲームの種類」とか、「作られた場所」のようなものは、クラス変数として扱うことができるね。
class Character:
# これはクラス変数。すべてのCharacterが「ファンタジーゲーム」に属するよ
game_genre = "ファンタジーゲーム"
def __init__(self, name, hp):
self.name = name
self.hp = hp
yusha = Character("勇者アキラ", 100)
mahoutsukai = Character("魔法使いリナ", 80)
print(yusha.game_genre) # 出力: ファンタジーゲーム
print(mahoutsukai.game_genre) # 出力: ファンタジーゲーム
print(Character.game_genre) # クラス名からもアクセスできるよ
クラス変数は、クラスの設計図の中に直接書くんだ。インスタンス変数とクラス変数をうまく使い分けることで、もっと整理されたプログラムを作れるようになるよ!