<Python> class 変数

Pythonのクラス変数 class variableを少し試してみた。

まずは、下記のクラス作成。
クラス変数 a と、それを、__init__()self.a で呼び出してみる。

In [98]: class Aaa():
    ...:     a = 1
    ...:     def __init__(self):
    ...:         self.x = self.a
    ...:     def cls_show(self):
    ...:         return Aaa.a
    ...:     def ins_show(self):
    ...:         return self.a
    ...:     @classmethod
    ...:     def cls_show2(cls):
    ...:         return cls.a
    ...:     

インスタンス化して、aを見てみる。

In [99]: A = Aaa()

In [100]: A.a
Out[100]: 1

In [101]: A.x
Out[101]: 1

In [102]: A.cls_show()
Out[102]: 1

In [103]: A.ins_show()
Out[103]: 1

In [104]: A.cls_show2()
Out[104]: 1

全部 1
__init__()時は、クラス変数aself.aで参照できるっぽい。
で、a5を入れてみる。

In [105]: A.a = 5

In [106]: A.a
Out[106]: 5

In [107]: A.x
Out[107]: 1

In [108]: A.cls_show()
Out[108]: 1

In [109]: A.ins_show()
Out[109]: 5

In [110]: A.cls_show2()
Out[110]: 1

self.a5
cls.a1
なるほど、ね。 self.aインスタンス変数だから、クラス変数を変更しない。

クラス変数a20を代入。

In [111]: Aaa.a = 20

In [112]: A2 = Aaa()

In [113]: A2.a
Out[113]: 20

In [114]: A2.x
Out[114]: 20

In [117]: A2.cls_show()
Out[117]: 20

In [118]: A2.ins_show()
Out[118]: 20

In [119]: A2.cls_show2()
Out[119]: 20

なるほど。
で、インスタンス変数a10を代入。

In [120]: A2.a = 10

In [121]: A2.a
Out[121]: 10

In [123]: A2.cls_show()
Out[123]: 20

In [124]: A2.ins_show()
Out[124]: 10

クラス変数は20をキープ。

なるほど。。。