Pythonの変数隠蔽?

Pythonでクラスを作成した後、そのクラスに属する変数ってクラス変数?インスタンス変数?まあ〜なんだな。Javaとかいろんな言語やってると呼び方なんかどうでも良くなる。と言うよりもごちゃごちゃになって明確に分けるのを放棄してしまうよね。

>>> class TestFunc():
...   name1   = "name1"
...   _name2  = "name2"
...   __name3 = "name3"
...   def __init__(self):
...     pass
...
>>> t = TestFunc()
>>> t.name1
'name1'
>>> t._name2
'name2'
>>> t.__name3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: Test instance has no attribute '__name3'

変数の先頭に「__」をつけると一応外から見えなくなるみたい。ただ、やり方を知っていればアクセス可能。

>>> t._Test__name3
'name3'

なるほど!Pythonって面白いよ。

Dive Into Python」にこんなんあった。

>>> class counter:
...   count = 0
...   def __init__(self):
...     self.__class__.count += 1
...
>>> counter
<class __main__.counter at 0x00AEDF30>
>>> counter.count
0
>>> c = counter()
>>> c.count
1
>>> d = counter()
>>> d.count
2
>>> c.count
2
>>> counter.count
2

動作は簡単で、単純にオブジェクトを生成した回数をカウントしているだけですよね〜

ではではでは

>>> class TestCounter:
...   count = 0
...   def __init__(self):
...     self.count += 1
...
>>> TestCounter
<class __main__.TestCounter at 0x00AEDF90>
>>> TestCounter.count
0
>>> c = TestCounter()
>>> c.count
1
>>> d = TestCounter()
>>> d.count
1
>>> c.count
1
>>> TestCounter.count
0

あれ?動作が違うね。なんで、同じかなと思ったんだが。

ん〜最初の「count」変数はクラスに属しており、コンストラクタ「__init__」ないでも「self.__class__.count」としクラスに属している「count」変数をカウントしているんだよね。で2つめのはコンストラクタ「__init__」では「self.count」としているが、これって、あくまで・・・どうなの?別の変数と言う考え方でいいの?名前は同じだけど属している場所が異なっており干渉しあわない。

ややこいな〜「self.count」とし「self」でアクセスしているのでクラスに属していてもよさそうなんだが・・・違うのか!もう少し調査必要かな。