2015年7月7日火曜日

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

改めて、クラス変数とインスタンス変数の違いを理解したので、まとめてみた。
class myClass():
    i = 0
とした場合、i がクラス変数となる。
class myClass():
    i = 1

myClass.i += 10
print myClass.i      # クラス変数が更新されているため 11 と表示される。

c1 = myClass()
print c1.i           # クラス変数が更新されているため 11 と表示される。

c1.i += 10
print c1.i           # c1 は myClass のインスタンスであるため、c1.i はインスタンス変数 
print myClass.i      # よって c1,i (=21) と myClass.i (=11) は値が異なる。
生成されるインスタンスに影響を及ぼすため、よほどの事情がない限り、クラス変数を更新することは控えたほうが望ましいと思われる。

インスタンス変数はインスタンスごとに領域を有する。
インスタンス変数は、self.変数名 で初期化する。クラス変数との違いは、クラス変数はクラス定義で変数宣言するが、インスタンス変数はメソッドの中で初期化することである。
class myClass():
    def __init__(self):
        self.i = 0
クラス変数、インスタンス変数とも、値を取得する場合は self.変数名で取得する。
ただし、クラス変数を self 経由で取得する際、同名のインスタンス変数がある場合は、それが優先される。
class myClass():
    i = 100
    j = 200
    def __init__(self):
        self.i = 0
    def show(self):
        print self.i         # インスタンス変数 (0) が表示される。
        print self.j         # クラス変数 (200) が表示される。
        print myClass.i      # クラス変数 (100) が表示される。

c1 = myClass()
c1.show()

0 件のコメント:

コメントを投稿