風で飛んでいくチラ裏

気ままに雑記メモ書き殴り。古い記事は別blogからの引っ越しなのでレイアウトがアレです。

pythonでprivate

pythonでprivateは存在しない、らしいことになってるんだけど、なんちゃってならあるようだ。
# privateにすることが主目的の機能ではない
#!/usr/env/bin python
# -*- coding: UTF-8 -*-
class hoge:
	
	def __init__(self):
		pass
	
	def method1(self):
		print "called method1"
	
	def __method2(self):
		print "called method2"
	
h = hoge()
# アクセスできる
h.method1()
try:
	# AttributeError 例外が発生する(そのままの名前じゃアクセスできない)
	h.__method2()
except Exception, detail:
	print str(detail)
# _[クラス名][メソッド名]でアクセスできる
h._hoge__method2()
実行結果はこんな感じ
$ python mangling.py
called method1
hoge instance has no attribute '__method2'
called method2
属性の先頭に __ をつけることで、インスタンス属性名になる際に _[クラス名]が頭につく。

モジュールのツリー構造内で同じ属性名があって、衝突してしまうのを防ぐためのネームマングリングという機能なんだけど、「そのままの名前ではアクセス出来ない」ということを擬似privateとして利用しているわけですな。