オブジェクト指向 中級

59. クラス変数とクラスメソッド

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

これまでself.nameのようにインスタンスごとに持たせてきたデータは「インスタンス変数」と呼ばれ、インスタンスごとに別々の値を持てます。一方、クラスの直下(__init__の外)に書いた変数は「クラス変数」と呼ばれ、そのクラスから作られたすべてのインスタンスで共有される、いわば「みんな共通の情報」になります。「犬という種族はみんなイヌ科である」というような、個体ごとに変わらない情報を持たせるのに向いています。

⚠️ 注意:クラス変数はすべてのインスタンスで共有されるため、うっかりミュータブル(変更可能)なリストなどをクラス変数にしてしまうと、1つのインスタンスでの変更が他のインスタンスにも影響してしまうことがあります。個体ごとに変わりうる情報は、必ずインスタンス変数として持たせるようにしましょう。

サンプルコード

class Dog:
    species = 'イヌ'  # クラス変数(全インスタンス共通)

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

dog1 = Dog('ポチ')
dog2 = Dog('コロ')
print(dog1.species, dog2.species)
print(dog1.name, dog2.name)
speciesはクラス変数なので、dog1とdog2のどちらから見ても同じ'イヌ'という値になります。一方nameはインスタンス変数なので、dog1とdog2でそれぞれ別の値('ポチ'と'コロ')を持っています。

📝 練習問題

練習問題:Circleクラスにクラス変数shape = '円'を追加し、2つのインスタンスから両方ともshapeを表示してください。