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

はじめに

本記事ではこちら(AI Academy クラスとオブジェクト)のテキストに記載されている内容から「クラス変数」と「インスタンス変数」の解説とそれぞれの違いを解説します。その他の内容も知りたい方は是非読んで見てください。

クラス変数とは

クラス変数とは、すべてのインスタンス間で共通した値をもつ変数です。クラス変数は以下のように、クラス内に定義することで作成できます。

class SampleClass:
    class_val = 'クラス変数'

クラス変数にアクセス(情報を取り出す)するには以下のようにします。

class SampleClass:
    class_val = 'クラス変数'
    
print(SampleClass.class_val) # クラス変数

出力結果

クラス変数

クラス変数にアクセスする①

クラス変数にアクセスするにはクラス名.クラス変数と記述します。クラス変数を変更すると、そのクラスからインスタンス化された全てのインスタンスのクラス変数が変更されます。

class SampleClass:
    class_val = 'クラス変数'
    
print(SampleClass.class_val) # クラス変数

# クラス変数を変更する
SampleClass.class_val = "変更2"
print(sample.class_val) # 変更2

出力結果

クラス変数
クラス変数の値を書き換える

クラス変数にアクセスする②

クラス変数にアクセスするにはクラス名.クラス変数以外にもインスタンス.クラス変数でもアクセスが可能です。

class SampleClass:
    class_val = 'クラス変数'

sample = SampleClass()
print(sample.class_val) # クラス変数にアクセス

出力結果

クラス変数

しかし、この記述方法ではクラス変数を直接書き換える事は出来ません。

class SampleClass:
    class_val = 'クラス変数'

sample = SampleClass()

sample.class_val = "クラス変数2"
print(sample.class_val) # クラス変数2
print(SampleClass.class_val) # クラス変数

出力結果

クラス変数2
クラス変数

また、インスタンス.__class__.クラス変数として、クラス変数にアクセスする事もでき、この時にクラス変数の値を書き換えたい場合は以下のよう記述する事が出来ます。

sample.__class__.class_val = "クラス変数の値を書き換える"
print(SampleClass.class_val) # クラス変数の値を書き換える
print(sample.class_val) # クラス変数の値を書き換える

出力結果

クラス変数の値を書き換える
クラス変数の値を書き換える

インスタンス.__class__.クラス変数の書き方で値を上書きした場合、別のインスタンスのクラス変数の値は全て共通した値を持ちます。

class SampleClass:
    class_val = 'クラス変数'

sample = SampleClass()
sample2 = SampleClass()

sample.__class__.class_val = "クラス変数の値を書き換える"

print(SampleClass.class_val)
print(sample.class_val)
print(sample2.class_val)

出力結果

クラス変数の値を書き換える
クラス変数の値を書き換える
クラス変数の値を書き換える

クラス変数以外に次のセクションで説明するインスタンス変数と呼ばれる変数もあります。インスタンス変数とは今の段階ではそのインスタンスだけで利用できる属性とお考えください。

インスタンス変数とは

インスタンス変数は、個々のインスタンスに格納される変数のことです。インスタンス変数のサンプルプログラムを例に理解を深めていきましょう。ここではUserクラスを作っていきます。

class User:
    # 実行順②
    def __init__(self, name): # インスタンス化されて渡ってくる値を受ける変数を定義します
        # インスタンス変数(属性の初期化)
        self.name = name # 実行順③
        print("コンストラクタが呼ばれました") # # 実行順④

    def hello(self):
        print("Hello " + self.name)
        
user = User("Sample User") # userというインスタンスを生成しています。 実行順①

今回定義したUserクラスのコンストラクタはnameという引数を取り、その引数で変数であるself.name(この変数のことをインスタンス変数と呼びます)を初期化しています。インスタンス変数は、個々のインスタンスに格納される変数のことですので、ここでは5行目のnameがインスタンス変数です。8行目に定義したhelloメソッド内9行目で、selfの後ろに属性名nameを書いていますが、このように.インスタンス変数名と書くことで、インスタンス変数の作成及びアクセスができます。

インスタンス変数にアクセスする

インスタンス変数にアクセスするには、インスタンス名.インスタンス変数と記述します。

user = User("Sample User")
py = User("python")

user.hello() # Hello Sample User
py.hello() # Hello python

出力結果

コンストラクタが呼ばれました
コンストラクタが呼ばれました
Hello Sample User
Hello python

Pythonを効率よく学ぶには?

Pythonの基本文法やデータ分析の基礎や統計学基礎などは無料アカウント登録することで、利用可能です。

もしくは、データサイエンティストや機械学習エンジニアに質問し放題かつ、体系的に学べる動画コンテンツでデータ分析技術を学びたい方は、オンラインで好きな時間に勉強できるAI Academy Bootcampがオススメです。