2010/06/05

python "クラス変数"

やっぱりクラス変数のこと良く分かってませんでした
クラス変数?インスタンス変数? - Ponsukeの日記
これこれ

例えば
class A(object):
n = 0
l = []

def __init__(self):
print self.n, self.l

self.n = self.n + 10
self.l.append(10)

print self.n, self.l

A()
A()
こんなの実行すると
0 []
10 [10]
0 [10]
10 [10, 10]
ってなって
「なんで self.n が 0 に戻るんだYo!!」
とか思うわけですが
  • 変数を参照するときはインスタンス変数探して無かったらクラス変数も見にいく
  • 代入するときはインスタンス変数で無かったらインスタンス変数作る
というわけで
    self.n = self.n + 10
この右辺はクラス変数を見てるけど左辺はインスタンス変数なのでした。

クラス変数もインスタンスから self.xxx でアクセスできるとあるけれど
何か混乱しそうなので注意するか別の方法をとるかした方がいいなぁ
と思いました