LoginSignup
31
27

More than 5 years have passed since last update.

クラス変数にはどうアクセスすべき?

Last updated at Posted at 2014-10-06

インスタンスメソッドからクラス変数にアクセスするには、クラス.変数名とすればよい。

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

確実にクラス変数にアクセスする、という意味ではクラス.変数名が良い気がするが、クラス名の変更に脆い。
そこはリファクタリングツールに頼る、というのが正解なのだろうか?

31
27
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
27