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 となる。だから意図的にわかっててアクセスするとアクセスできてしまう。
最後の2行が意地悪アクセス。こういうのを「禁止」できないのが、隠蔽できないという理由だが、まあ__member3と書いて文句言われるぐらいなら隠蔽はできなくてもいいよね。(信者脳)。
勉強になった。
信者が勝手に推測すると、アクセスできるかどうかを真面目に実装すると重いからパフォーマンス重視的にはやりたくないんじゃなかろうか。ナイスな実装案が提案されたらpython4とかでできるようになるかもしれない。
そもそも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とかでできるようになるかもしれない。
コメント 0