可能性の重複:
The meaning of a single- and a double-underscore before an object name in Python前にアンダースコアを持つPythonの属性の違いは何ですか、バック
私のpython
でこれらの間で異なっているかを知りたいですself._var1
self._var1_
出発点として
self.__var1
self.__var1__
可能性の重複:
The meaning of a single- and a double-underscore before an object name in Python前にアンダースコアを持つPythonの属性の違いは何ですか、バック
私のpython
でこれらの間で異なっているかを知りたいですself._var1
self._var1_
出発点として
self.__var1
self.__var1__
、あなたはおそらくPEP 8 - Style Guide For Python Codeから行きまし引用見つける:また
を、先頭または末尾 アンダースコアを使用して、次の特別な形式が認識されています(これらは一般に任意の の大会規約と組み合わせることができます):
_single_leading_underscore
:弱い「内部使用」インジケータ。例えば。from M import *
は、名前がアンダースコアで始まるオブジェクトをインポートしません。
single_trailing_underscore_
:コンフリクトを回避するために慣習で使用されます。 Pythonキーワードを使用します。Tkinter.Toplevel(master, class_='ClassName')
__double_leading_underscore
:クラス属性に名前を付けるとき、(__boo
が_FooBar__boo
なり、クラスFooBarの内、下記 を参照)マングリング名を呼び出します。が
__double_leading_and_trailing_underscore__
:ユーザーが制御する名前空間に存在する「魔法の」オブジェクトまたは属性。例えば。__init__
,__import__
または__file__
である。そのような名前を発明しないでください。文書化されているものだけを使用してください。あなたのクラスself._var1
内の属性の命名シングル先頭にアンダースコア
のユーザに示す:
あなたが、しかし、それでは、あなたの具体的な例を見てみましょうクラス属性のコンテキストで尋ねましたクラスの内部(またはおそらくサブクラスのもの)によってのみアクセスされるべきであり、直接アクセスする必要はなく、おそらくそれを変更すべきではないというクラスです。 JavaまたはC#でprivate
またはprotected
フィールドを使用するのと同じ場所に先頭のアンダースコアを使用する必要がありますが、言語が実際には非アクセスを強制しないことに注意してください。代わりに、クラスのユーザーが何もしないこと、クラスのプライベートフィールドにアクセスする(または変更する)オプションを残しておけば、実際に自分が行っていることを知っていて、それが理にかなっていることが本当に分かります。
self._var1_
アンダースコア末尾には私が今まで見てきたものではありません。私はこの命名様式がPython世界で従来の意味を持っているとは思わない。
強調する。あなたのクラスのスコープ内からself.__var1
を参照すると、name manglingが呼び出されます。あなたのクラス外では、変数はself.__var1
の代わりにself._YourClassName__var1
に表示されます。誰もがこれを使っているわけではありません。私が働いている場所はまったくありません。簡単なクラスでは、単一の先頭のアンダースコアを使用する代わりに、ちょっとばかげて刺激的な感じがします。
しかし、それが存在するのは正当な理由があります。あなたが多くの継承を使用している場合、単一の先頭のアンダースコアを使用するだけでは、あなたのコードを読んでいる人に、「プライベート」変数と「プロテクト」変数の違いを示す方法はありません。サブクラスがアクセスできるが、サブクラスがアクセスすることができるが、外部の世界はアクセスしない可能性がある。単一の末尾のアンダースコアを使用して '保護された'を意味し、二重のアンダースコアが 'プライベート'を意味する場合は、このような状況では便利な規則です(名前のマングリングによってサブクラスでサブクラスで同じ名前の変数を使用することはできません)衝突)。ダブル先頭と末尾のアンダースコア命名スタイルが特別な意味を持つ名前にのみ使用されることを意味しているので、
self.__var1__
アンダースコア末尾には、私は文字通りそれを書いたとして、あなたが作成することはありませんものです__init__
または__eq__
クラスのメソッドのように、Pythonで定義されています。クラスの振る舞いを変更するためにそれらをオーバーライドすることは自由です(実際にはほとんどすべてのクラスはプログラマが__init__
と定義されています)。self.__var1__
のような独自の名前を作るべきではありません。
[docs](http://docs.python.org/2/reference/)にも詳しく記載されています。 lexical_analysis.html#reserved-class-of-identifiers)。 –
"単一の先頭と末尾のアンダースコア":これは、ユーザーが変更可能な特別なメソッドに相当するものとして、いくつかのプロジェクトで使用されています。たとえば、[Sage](http://www.sagemath.org/doc/developer/coding_in_python.html#special-sage-functions)で使用します。私はそれを他の場所でも見たことがありますが、私は手を離れた例を考えることはできません。 – DSM
**二重先頭アンダースコア**の最後の3行は、その逆にする必要があります。単一アンダースコア=プライベート、ダブルアンダースコア=保護 – amirteymuri
可能な重複:http://stackoverflow.com/questions/1301346/the-meaning-of-a-single-and-a-double-underscore-before-an-object-name-in-python and http: //stackoverflow.com/questions/935378/python-question-about-the-difference-beeth-modod-and-method –