[解決済み] オブジェクト名の前のシングルアンダーコアとダブルアンダーコアの意味は何ですか?
質問
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!'}
関連
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] インターフェースと抽象クラスの違いは何ですか?
-
[解決済み] インターフェースと抽象クラス(一般的なOO)
-
[解決済み] 億の相対的輸入
-
[解決済み] re.searchとre.matchの違いは何ですか?
-
[解決済み】__str__と__repr__の違いは何ですか?
-
[解決済み】type()とisinstance()の違いは何ですか?)
-
[解決済み】Pythonの「private」メソッドは、なぜ実際にはprivateではないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonの非常に便利な2つのデコレーターを解説
-
opencvとpillowを用いた顔認証システム(デモあり)
-
Python jiabaライブラリの使用方法について説明
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み】 AttributeError: モジュール 'matplotlib' には属性 'plot' がない。
-
[解決済み】TypeError: 系列を <class 'float'> に変換することができません。
-
[解決済み】"No JSON object could be decoded "よりも良いエラーメッセージを表示する。
-
[解決済み] 'int'オブジェクトに'__getitem__'属性がない。
-
[解決済み】ValueError: xとyは同じサイズでなければならない
-
[解決済み] 変数とメソッドでのアンダースコアとダブルアンダースコア [重複]