1. ホーム 
  2. 備忘録 
  3. Python

クラス変数

クラス変数

クラスに関連する変数として、インスタンス変数のほかにクラス変数というものがある

インスタンス変数はインスタンス単位でメモリを確保するのに対し、クラス変数はクラス単位でメモリを確保する

つまり、クラス変数の値を書き換えると同じクラスから派生した他のインスタンスも同様の影響を受けるというものである

クラス変数の扱い方について以下に記載する

lesson.py

class T(object):
    kind = 'human'

    def __init__(self, name):
        self.name = name

    def who_are_you(self):
        # 読み取り時はクラス変数とインスタンス変数はアクセス方法は同じでもok
        # クラス変数は クラス名.変数名 でもアクセスできる 例:T.kind
        print(self.name, self.kind)


a = T('A')
b = T('B')
a.who_are_you()  # A human
b.who_are_you()  # B human

クラス変数は インスタンス名.変数名 または クラス名.変数名 でアクセスできるが、書き込み時には違いが出るので注意する

書き込み時の違いについて具体例を以下に記載する

lesson.py

class T(object):
    kind = 'human'

    def __init__(self, name):
        self.name = name

    def who_are_you(self):
        print(self.name, self.kind)


a = T('A')
a.who_are_you()  # A human
# インスタンス変数を確認
print(vars(a))  # {'name': 'A'}

# クラス変数を クラス名.変数名 でアクセスして書き換え
a.name = 'B'
T.kind = 'dog'
a.who_are_you()  # B dog
# インスタンス変数を再確認
print(vars(a))  # {'name': 'B'}


# インスタンス名.変数名 でアクセスして書き換えしようと試みる
a.name = 'C'
a.kind = 'cat'
a.who_are_you()  # C cat
# インスタンス変数を再確認
print(vars(a))  # {'name': 'C', 'kind': 'cat'}
# クラス変数はメモリに残っているが、インスタンス変数が別途追加されて不具合の原因となる
print(a.kind, T.kind)  # cat dog