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

Pythonのクラスにはクラス変数とインスタンス変数という2つの種類の変数を作成することができます。

それぞれの変数には影響範囲が異なり、混乱して利用すると思わぬ不具合を誘発するので注意して利用することが必要です。

スポンサーリンク

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

Pythonのクラスにはクラス変数とインスタンス変数という2つの種類の変数を作成することができます。

それぞれの特徴は以下の通りです。

クラス変数はそのクラスから生成されたインスタンスすべてから参照可能な変数で、各インスタンスで値も共有します。
(変更すると全インスタンスからの参照する値が変わって見えます。)
インスタンス変数は、それぞれのインスタンス内のみで確保される変数で、値を変更しても他のインスタンスの変数には影響を与えません

具体的にはクラス変数はクラス宣言の直下に宣言され、インスタンス変数は各関数の中で設定されます。

class myClass:
    #ここにはクラス変数を宣言します。
    g_name = None

    def __new__( cls, p_name ):
        #ここにでクラス変数に値を設定します。
        cls.g_name = 'Taro'
        return object.__new__( cls )

    def __init__( self, p_name ):
        #ここにでインスタンス変数に値を設定します。
        self.name = p_name

    #インスタンス変数に値を設定します
    def setName( self, p_name ):
        #ここにでインスタンス変数に値を設定します。
        self.name = p_name
        return 'set ' + p_name

    #インスタンス変数の値を返します
    def getName( self ):
        return self.name

    #クラス変数の値を返します
    def getClName( self ):
        return self.g_name

c1 = myClass( 'Jiro' )
c2 = myClass( 'Yoshiko' )

print( 'クラス変数.name        =[' + myClass.g_name + ']' )
print( 'c1 インスタンス変数name=[' + c1.getName() + ']')
print( 'c2 インスタンス変数name=[' + c2.getName() + ']')

print( 'インスタンス変数の値を変更します。')
print( c1.setName( 'Hanako' ))
print( 'c1 インスタンス変数name=[' + c1.getName() + ']')
print( 'c2 インスタンス変数name=[' + c2.getName() + ']')

print( 'クラス変数の値を変更します。')
myClass.g_name= 'Hana'
print( 'クラス変数.name        =[' + myClass.g_name + ']' )
print( 'c1.getClName()=[' + c1.getClName() + ']')
print( 'c2.getClName()=[' + c2.getClName() + ']')

上記のプログラムを実行すると

クラス変数.name        =[Taro]
c1 インスタンス変数name=[Jiro]
c2 インスタンス変数name=[Yoshiko]
インスタンス変数の値を変更します。
set Hanako
c1 インスタンス変数name=[Hanako]
c2 インスタンス変数name=[Yoshiko]
クラス変数の値を変更します。
クラス変数.name        =[Hana]
c1.getClName()=[Hana]
c2.getClName()=[Hana]

になります。

インスタンス変数を変更しても他のインスタンスの値は変更されませんが、クラス変数の値は変更すると全インスタンスのクラス変数の値が変更されます。

まとめ

クラス変数とインスタンス変数の違いを表にまとめると

  クラス変数 インスタンス変数
共有範囲 すべてのインスタンスで共有
クラス内でユニーク
インスタンス内で確保
インスタンス内でユニーク
アクセス すべてのインスタンスから可能 インスタンス内のみ可能
定義 クラス名直下に宣言 インスタンスの関数内で設定
クラスオブジェクトから参照 可能 不可能
インスタンスオブジェクトから参照 可能 可能

となります。

以上、Pythonのクラス変数とインスタンス変数の違いでした。

タイトルとURLをコピーしました