pythonにはprivate変数はありません。
しかしprivate変数に近いことは実現できます。
_
1つのprefix
PEP8上のコーディング規約としては
_
(アンダースコア)1つのprefixをclass内のみで利用する変数とされています。
この変数はfrom M import *
とした場合、
importされません。
しかし、この変数名は単なる紳士協定にすぎず、
インスタンス化したオブジェクトからのアクセス時の
物理的な機構はなくカプセル化としての役目は果たせません。
__
2つのprefix
__
(アンダースコア)2つのprefixをつけた場合、
ネームマングリング機構が働きます。
Name Manglingとは名前修飾という意味で、
該当のprefixが付いている変数にはpythonコード上で意味が与えられます。
該当の変数名は_{class名}
のprefixがついた変数名へと置換されます。
ただし、これもあくまで変数名が置換されるために
通常のような、インスタンスからの変数名へのアクセスが
できなくなるだけです。
通常よりは硬い実装にはなりますね。
あくまで変数名が変わっているだけなので
置換後の変数名へのアクセスは許します。
本来、ネームマングリング機構は
親クラスと子クラス間での名前衝突を避ける目的の為のもののようです。
(__init__
や、__main__
などのメソッドの所属元クラスをはっきりさせる)
具体例
class HogeHoge:
_dummy_private = "hoge"
__almost_private = "hoge"
class Main:
hogehoge = HogeHoge()
# 丸見え
a = hogehoge._dummy_private
# エラー
b = hogehoge.__almost_private
# こうするとアクセスできちゃう
# _{class名}のprefixがついた変数名へと置換されている
c = hogehoge._HogeHoge__almost_private