SSブログ

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

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。