PYTHON MEBY

Pythonでインスタンス変数・クラス変数を使う

この記事では、Pythonにおけるインスタンス変数とクラス変数の使い方、違い、そして適切な使い分けについて解説します。具体的なコード例を通して理解を深めます。

目次

インスタンス変数とは?

インスタンス変数は、クラスの各インスタンス(オブジェクト)に固有の変数です。インスタンスが生成されるたびに個別の値を持つことができます。 `self.変数名` の形で定義します。

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

dog1 = Dog("Buddy", 3)
dog2 = Dog("Lucy", 5)
print(dog1.name, dog1.age)  # 出力: Buddy 3
print(dog2.name, dog2.age)  # 出力: Lucy 5

上記のように、`dog1` と `dog2` はそれぞれ異なる `name` と `age` の値を持っています。

クラス変数とは?

クラス変数は、クラス全体で共有される変数です。クラスのすべてのインスタンスが同じクラス変数を参照し、値を共有します。クラス定義内で、`self` を使わずに定義します。通常はクラス名を使ってアクセスします。

class Dog:
    species = "Canis familiaris"  # クラス変数
    def __init__(self, name, age):
        self.name = name
        self.age = age

dog1 = Dog("Buddy", 3)
dog2 = Dog("Lucy", 5)
print(dog1.species)  # 出力: Canis familiaris
print(dog2.species)  # 出力: Canis familiaris
print(Dog.species) #出力: Canis familiaris

すべてのDogインスタンスは同じ`species`の値を共有しています。クラス名`Dog`を使って直接アクセスすることも可能です。

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

主な違いはスコープです。インスタンス変数はインスタンスごとに固有の値を持ち、クラス変数はクラス全体で共有されます。インスタンス変数はインスタンスを通してアクセスし、クラス変数はクラス名やインスタンスを通してアクセスできます。

クラス変数の値を変更した場合、その変更はすべてのインスタンスに反映されます。

具体的なコード例

class Dog:
    species = "Canis familiaris"
    num_dogs = 0  # クラス変数: 犬の数
    def __init__(self, name, age):
        self.name = name
        self.age = age
        Dog.num_dogs += 1

dog1 = Dog("Buddy", 3)
dog2 = Dog("Lucy", 5)
print(Dog.num_dogs)  # 出力: 2
print(dog1.num_dogs) # 出力: 2
Dog.species = "Canis lupus"
print(dog1.species)  #出力:Canis lupus
print(dog2.species) #出力:Canis lupus

インスタンス変数とクラス変数の使い分け

インスタンス変数は、各オブジェクトに固有のデータ(名前、年齢など)を保存するのに適しています。クラス変数は、クラス全体に共通する属性(種、デフォルト値など)を保存するのに適しています。適切な使い分けをすることで、コードの可読性と保守性を高めることができます。

関連記事