変数のスコープ | クラス変数とインスタンス変数 | Python本格超入門

現在作成中です。今後加筆修正してまいります。
スポンサーリンク

スポンサーリンク

変数のスコープ

Pythonにおける変数には、スコープ(有効範囲)があります。クラスの変数には大きく分けて「クラス変数」と「インスタンス変数」があり、それぞれのスコープが異なります。この章では、クラス変数とインスタンス変数の違い、および変数のスコープについて説明します。

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

クラス変数は、クラス全体で共有される変数であり、すべてのインスタンスが同じ値を参照します。一方、インスタンス変数は、各インスタンスごとに異なる値を持つことができ、それぞれのオブジェクトに固有の情報を保存します。

クラス変数の例

クラス変数は、クラス定義内に直接定義され、すべてのインスタンスで共有されます。以下の例では、countというクラス変数を使って、生成されたインスタンスの数を追跡しています。


class Dog:
    # クラス変数
    count = 0

    def __init__(self, name):
        self.name = name  # インスタンス変数
        Dog.count += 1  # クラス変数の更新

    def bark(self):
        return f"{self.name}が吠えています!"

# インスタンスの生成
dog1 = Dog("ポチ")
dog2 = Dog("ハチ")

# クラス変数へのアクセス
print(Dog.count)  # 出力: 2
    

上記のコードでは、Dog.countはクラス変数であり、すべてのインスタンスで共有されています。新しいインスタンスが作成されるたびに、このクラス変数は更新されます。

インスタンス変数の例

インスタンス変数は、クラスの各インスタンスに固有の値を保持します。以下の例では、各犬(Dog)に異なる名前を設定しています。


class Dog:
    def __init__(self, name):
        # インスタンス変数
        self.name = name

    def bark(self):
        return f"{self.name}が吠えています!"

# インスタンスの生成
dog1 = Dog("ポチ")
dog2 = Dog("ハチ")

# インスタンス変数へのアクセス
print(dog1.bark())  # 出力: ポチが吠えています!
print(dog2.bark())  # 出力: ハチが吠えています!
    

上記のコードでは、各インスタンスにnameというインスタンス変数が定義されており、dog1dog2はそれぞれ異なる名前を持っています。インスタンス変数は、各オブジェクト固有のデータを保持するために使用されます。

クラス変数とインスタンス変数の違い

クラス変数 インスタンス変数
クラス全体で共有される変数 各インスタンスに固有の変数
クラス定義内に直接定義 コンストラクタ(__init__メソッド)で定義
すべてのインスタンスで同じ値を参照 各インスタンスで異なる値を持つ

変数のスコープ

変数のスコープは、変数がどこで定義され、どこからアクセス可能かを指します。クラス変数はクラス全体で共有され、クラス内のどこからでもアクセスできますが、インスタンス変数は各インスタンスごとに異なり、クラスのメソッド内でしかアクセスできません。

まとめ

クラス変数とインスタンス変数の違いを理解することは、オブジェクト指向プログラミングにおいて重要です。クラス変数は全体で共有されるデータを保持し、インスタンス変数は各オブジェクトごとに異なるデータを保持します。それぞれの用途に応じて使い分けましょう。