変数のスコープ
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
というインスタンス変数が定義されており、dog1
とdog2
はそれぞれ異なる名前を持っています。インスタンス変数は、各オブジェクト固有のデータを保持するために使用されます。
クラス変数とインスタンス変数の違い
クラス変数 | インスタンス変数 |
---|---|
クラス全体で共有される変数 | 各インスタンスに固有の変数 |
クラス定義内に直接定義 | コンストラクタ(__init__ メソッド)で定義 |
すべてのインスタンスで同じ値を参照 | 各インスタンスで異なる値を持つ |
変数のスコープ
変数のスコープは、変数がどこで定義され、どこからアクセス可能かを指します。クラス変数はクラス全体で共有され、クラス内のどこからでもアクセスできますが、インスタンス変数は各インスタンスごとに異なり、クラスのメソッド内でしかアクセスできません。
まとめ
クラス変数とインスタンス変数の違いを理解することは、オブジェクト指向プログラミングにおいて重要です。クラス変数は全体で共有されるデータを保持し、インスタンス変数は各オブジェクトごとに異なるデータを保持します。それぞれの用途に応じて使い分けましょう。