ナンドクカ

Pythonには、アンダースコア二つ"__"から始まって、アンダースコア二つ"__"で終わらない名前の属性が、難読化される、というよくわからん仕様がある。
自分でコードを書くときに、使ったことはない。
アンダースコア_をひとつだけつけて、プライベートっぽさを示す、ということはするときもある。それで十分なことが多いと思う。それでは不十分な場合は、難読化でも不十分なことが多いだろうし。

仕様としては、以下のような感じ。

>>> class C(object):
	def __init__(self,name):
		self.__name = name
	def getName(self):
		return self.__name

	
>>> c = C("hoge")
>>> c.getName()
'hoge'
>>> c._C__name
'hoge'
>>> hasattr(c, "__name")
False
>>> hasattr(c, "_C__name")
True
>>> class C2(C):
	def __init__(self, name):
		super(C2, self).__init__(name)
	def upper(self):
		return self.__name.upper()
	def upper2(self):
		return self.getName().upper()

>>> c2 = C2("hogehoge")
>>> c2.upper()
AttributeError: 'C2' object has no attribute '_C2__name'
>>> c2.upper2()
'HOGEHOGE'

>>> class C3(C):
	def __init__(self, name):
		self.__name = name
	def upper(self):
		return self.__name.upper()
	def upper2(self):
		return self.getName().upper()

	
>>> c3 = C3("hogehogehoge")
>>> c3.upper()
'HOGEHOGEHOGE'
>>> c3.upper2()
AttributeError: 'C3' object has no attribute '_C__name'
>>> c3._C__name = "xxx"
>>> c3.upper2()
'XXX'
>>> c3.upper()
'HOGEHOGEHOGE'