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
インスタンス変数とクラス変数の使い分け
インスタンス変数は、各オブジェクトに固有のデータ(名前、年齢など)を保存するのに適しています。クラス変数は、クラス全体に共通する属性(種、デフォルト値など)を保存するのに適しています。適切な使い分けをすることで、コードの可読性と保守性を高めることができます。
関連記事
- Pythonで関数内でグローバル変数・ローカル変数を使う
- Pythonで継承を使う
- Pythonで静的メソッド・クラスメソッドを使う(@staticmethod, @classmethod)
- Pythonでクラスを定義(class)
- Pythonでコンストラクタを定義(__init__)
- Pythonでメソッドを定義
- Pythonで特殊メソッドを使う(__str__, __repr__, __add__ など)
- Pythonでプロパティを使う(@property, @setter, @deleter)
- Pythonでカプセル化(private, protected)を実装
- Pythonでデータクラスを使う(dataclasses.dataclass, Python 3.7以降)