Pythonにおけるオブジェクト

インスタンス変数とクラス変数

クラスとインスタンスの関係がわかったところで、次は「インスタンス変数」と「クラス変数」という、二つの特別な「変数」について学ぼう。

これは、それぞれの「モノ(インスタンス)」が持っている特徴なのか、それとも「設計図(クラス)」自体が持っている特徴なのか、という違いなんだ。

インスタンス変数

インスタンス変数」は、それぞれの「モノ(インスタンス)」が個別に持っている特徴のことだよ。

例えば、ゲームのキャラクターで考えてみよう。勇者と魔法使いは、それぞれ違う「体力」や「攻撃力」を持っているよね?これは、キャラクターごとに違うから、インスタンス変数として扱うんだ。


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)  # クラス名からもアクセスできるよ

クラス変数は、クラスの設計図の中に直接書くんだ。インスタンス変数とクラス変数をうまく使い分けることで、もっと整理されたプログラムを作れるようになるよ!