風で飛んでいくチラ裏

気ままに雑記メモ書き殴り。古い記事は別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として利用しているわけですな。
広告を非表示にする
(function(document){ var pres = document.getElementsByTagName("pre") for(var i=pres.length; i--; ){  var el = makeOl(pres[i]) pres[i].appendChild(el) } function makeOl(pre){ var ol = document.createElement("ol") , li = document.createElement("li") , df = document.createDocumentFragment() , br = pre.innerHTML.match(/\n/g) ol.className = "preLine" ol.setAttribute("role", "presentation") for(var i=br.length; i--; ){ var li2 = li.cloneNode(true) df.appendChild(li2) } ol.appendChild(df) return ol } })(document)