So-net無料ブログ作成
検索選択

pythonにprivate変数がない件 [プログラミング]

お前そんなことも知らないでpython信者自称してんのかと言われると「はい、すいません」としか言えない。そんな話。

そもそもpythonとかのLL言語でクラスなんて書きたくねーし。というぐらい手続き脳。
一応C++の魔界の入り口にたったことがあるぐらいのシャチレベル拳士。

で、ちょっと調べてみると、確かにpythonでは隠蔽できないよみたいなことが公式に書いてある。
くっ、我らがpythonがなぜ・・・と思ったが、9.6にルール的なものが書かれていた。

http://docs.python.jp/2/tutorial/classes.html#tut-private

9.6. プライベート変数
オブジェクトの中からしかアクセス出来ない “プライベート” インスタンス変数は、 Python にはありません。

ガーソ。

よく読むと解決方法はその後に書いてある。

・頭に1個だけアンダーバーをつける
 これはpythonの慣習でアンダーバーがついていたら非publicだと(人間が)思いなされ

ちょっとこれは俺が思う最強のpythonとしては理解し難い。pythonって誰がどう書いても同じコードになってしまううぅぅぅっていう強い制約がpythonらしさだと勝手に思っていたので、ちょっとなーっていう。

・頭に2個アンダーバーをつける
 こっちは割と妥当。これをやるとネームマングリング(C++の関数名とか変数名のアレ)が発生する。がC++のそれと違って命名規則が決まっている
 具体的には __x とすると _クラス名__x となる。だから意図的にわかっててアクセスするとアクセスできてしまう。

class Klass:
    __x = 10
    def __init__(self,value):
        self.member1   = value
        self._member2  = value
        self.__member3 = value

instance = Klass("ahaha")

print "member1=",instance.member1
print "member2=",instance._member2
print "member3=",instance._Klass__x
print "member3=",instance._Klass__member3


最後の2行が意地悪アクセス。こういうのを「禁止」できないのが、隠蔽できないという理由だが、まあ__member3と書いて文句言われるぐらいなら隠蔽はできなくてもいいよね。(信者脳)。

勉強になった。

信者が勝手に推測すると、アクセスできるかどうかを真面目に実装すると重いからパフォーマンス重視的にはやりたくないんじゃなかろうか。ナイスな実装案が提案されたらpython4とかでできるようになるかもしれない。

nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL:
※言及リンクのないトラックバックは受信されません。