メモ: Pythonにおけるクラス変数の挙動

Python 2.6言語リファレンスより:

クラス定義内で定義された変数はクラス変数です; クラス変数は全てのインスタンス間で共有されます。 インスタンス変数を作成するには、メソッドの中で self.name = value でセットできます。クラス変数もインスタンス変数も “self.name” 表記でアクセスすることができます。この表記でアクセスする場合、インスタンス変数は同名のクラス変数を隠蔽します。

http://www.python.jp/doc/release/reference/compound_stmts.html#class

ちょっと記述がピンと来なかったので、短いサンプルで挙動を確認してみました。動作確認環境はUbuntu 10.04に含まれるPython 2.6です。

インスタンスからのクラス変数参照

クラスTestClassの中でクラス変数valueを定義すると、TestClass.valueという形式と、TestClassのインスタンスxについてx.valueという形式の両方でクラス変数を参照できます。

>>> class TestClass:
	value = 10

>>> TestClass.value
10 # クラス変数としての参照
>>> x = TestClass()
>>> x.value
10 # インスタンスからのクラス変数参照

クラス変数の更新

先ほど定義したTestClassについて、TestClass.value = <新しい値> とすることで、クラス変数の値を更新できます。この変更はx.valueという形式での参照にも反映されます。

>>> TestClass.value = 20
>>> TestClass.value
20
>>> x.value
20 # インスタンスから見た場合でもクラス変数の更新が反映されている

インスタンス変数によるクラス変数の隠蔽

一方、TestClassのインスタンスxについて、x.value = <新しい値> とすると、x.valueインスタンス変数となって同名のクラス変数を隠蔽することになります。この状態では、TestClass.valueを更新してもx.valueには反映されません。

>>> x.value = 30
>>> TestClass.value = 0
>>> x.value
30 # 直前のTestClass.value=0の結果は見えない