表示されるのはmangling という名前です。二重下線で始まる名前は、サブクラスでの名前の衝突を避けるために特別な方法で処理されます。
基本的に、クラスに属性がある場合は常に、継承時の名前の衝突を避けるため__some_name
に自動的に名前が変更されます。_YourClass__some_name
dir()
これは、次の関数を使用して確認できます。
>>> class MyClass(object):
... __var = 1
...
>>> dir(MyClass)
['_MyClass__var', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
リストに が含まれていないことに注意してください。__var
_MyClass__var
修正は簡単です:二重下線で始まる変数名を使用しないでください。変数をプライベートとしてマークしたい場合、慣習として単一のアンダースコアを使用します。
名前マングリングの主な目的は、サブクラスとの名前空間の衝突を避けることです。
>>> class MyClass(object):
... def __init__(self, val):
... self._value = val
...
>>> class MySubclass(object):
... def __init__(self, val):
... super(MyClass, self).__init__(val)
... self._value = val ** 2 #this hides the base class attribute!
...
基本クラスがサードパーティのライブラリからのものである場合、それらは API の一部ではないため、どのプライベート属性が定義されているかを知ることができないことに注意してください。で確認するとdir
、どの名前が使用されているかについてのヒントしか得られませんが、それらは実装の詳細であるため、予告なしに変更される可能性があります。
属性を非公開として「マーク」するためにこれを使用しないでください。Pythonの規則では、単一のアンダースコアで始まる属性はプライベートです。
関連するトピックでは、名前__something__
の先頭と末尾の両方に二重アンダースコアがあるフォームの名前も特別に扱われます。それらのいくつかは特別なメソッドを実装しているため、この種の識別子は決して使用しないでください。