インスタンスメソッドからクラス変数にアクセスするには、クラス.変数名
とすればよい。
In [1]: class A(object):
...: TEST = "test"
...: def test(self):
...: print(A.TEST)
...:
In [2]: a = A()
In [3]: a.test()
test
実はself(インスタンスメソッドの第一引数)
経由でもクラス変数にアクセスすることが可能である。
In [4]: class A(object):
TEST = "test"
def test(self):
# self経由でもアクセスできる。
print(self.TEST)
...:
In [5]: a = A()
In [6]: a.test()
test
self
でアクセスする場合、クラス変数が不変(読み込みのみ)の場合は特に問題ない。(注:PythonはJavaでいうfinalに相当する機能がないため、あくまで書き変えをしないで扱いましょうという紳士協定)
しかしクラス変数を可変にしたい場合、気をつけないと「クラス変数を書き変えたつもりが同名のインスタンス変数を定義した」ということが起こりうる。
# A.TESTではなくa.TESTに代入してしまった。
In [7]: a.TEST = "instancetest"
# クラス変数(A.TEST)ではなくインスタンス変数(a.TEST)が参照される。
In [8]: a.test()
instancetest
確実にクラス変数にアクセスする、という意味ではクラス.変数名
が良い気がするが、クラス名の変更に脆い。
そこはリファクタリングツールに頼る、というのが正解なのだろうか?