1. ホーム
  2. python

[解決済み] オブジェクト名の前のシングルアンダーコアとダブルアンダーコアの意味は何ですか?

2022-03-19 07:22:50

質問

Pythonでオブジェクト名の前にシングルとダブルのリーディングアンダースコアを付けることの正確な意味と、両者の違いについて、どなたか説明してください。

また、その意味は、そのオブジェクトが変数、関数、メソッドなどであっても変わらないのでしょうか?

どのように解決するのですか?

シングルアンダーコア

クラス内の名前にアンダースコアが付いているのは、他のプログラマにその属性やメソッドがプライベートであることを示すためだけです。 しかし、この名前自体には特別な意味はありません。

引用すると PEP-8 :

_single_leading_underscore: 弱い "内部使用"指標。例 from M import * は、名前がアンダースコアで始まるオブジェクトをインポートしません。

ダブルアンダーコア(名前の混同)

から Pythonのドキュメント :

形式の任意の識別子 __spam (少なくとも2つの先頭のアンダースコアと最大1つの末尾のアンダースコア)は、テキストでは _classname__spam ここで classname は、先頭のアンダースコアを取り除いた現在のクラス名です。このマングリングは識別子の構文上の位置を無視して行われるため、 クラスプライベートなインスタンス変数やクラス変数、メソッド、 グローバル変数、インスタンスに格納された変数などを定義するのに使用できます。

そして、同じページからの警告。

名前のマングリングは、クラスに「プライベート」なインスタンス変数やメソッドを簡単に定義する方法を提供することを目的としており、派生クラスが定義するインスタンス変数やクラス外のコードによるインスタンス変数の操作について心配する必要はありません。マングリングのルールは、事故を避けるためのものであることに注意してください。

>>> class MyClass():
...     def __init__(self):
...             self.__superprivate = "Hello"
...             self._semiprivate = ", world!"
...
>>> mc = MyClass()
>>> print mc.__superprivate
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: myClass instance has no attribute '__superprivate'
>>> print mc._semiprivate
, world!
>>> print mc.__dict__
{'_MyClass__superprivate': 'Hello', '_semiprivate': ', world!'}