名前マングリング
2個のアンダースコアが前置されたクラス内のオブジェクトは、名前マングリング(name mangling : めった斬りにする)という仕組みに基づき、外部に対しては名称が変更されます。
code:python
class Myclass:
__a = 'アンダースコア2個のクラス変数'
def __init__(self):
self.__x = 'アンダースコア2個のインスタンス変数'
c1 = Myclass()
print('#', c1._Myclass__x)
# アンダースコア2個のインスタンス変数
code:python
c1 = Myclass()
d1 = vars(c1)
print(d1)
# {'_Myclass__x': 'アンダースコア2個のインスタンス変数'}
つまり、変数マングリングにより、元の名称は
code:text
_【クラス名】__【元の名称】
と変換されます。外部からアクセスするには、
code:python
c1._Myclass__x = 999
print(c1._Myclass__x)
の通りです。
クラス変数も同様です。
code:python
class Myclass:
__x = 'アンダースコア2個のクラス変数'
print('#', Myclass._Myclass__x)
# アンダースコア2個のクラス変数
インスタンスメソッドも同様です。
code:python
class Myclass:
def __mymeth(self):
print('# mymeth of Myclass')
c1 = Myclass()
c1._Myclass__mymeth()
# mymeth of Myclass