2013-02-03 14 views
31

可能性の重複:
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__

+2

可能な重複: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 –

答えて

56

、あなたはおそらく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世界で従来の意味を持っているとは思わない。

ダブル大手はこの1つは実際に構文的意義を持っている

強調する。あなたのクラスのスコープ内からself.__var1を参照すると、name manglingが呼び出されます。あなたのクラス外では、変数はself.__var1の代わりにself._YourClassName__var1に表示されます。誰もがこれを使っているわけではありません。私が働いている場所はまったくありません。簡単なクラスでは、単一の先頭のアンダースコアを使用する代わりに、ちょっとばかげて刺激的な感じがします。

しかし、それが存在するのは正当な理由があります。あなたが多くの継承を使用している場合、単一の先頭のアンダースコアを使用するだけでは、あなたのコードを読んでいる人に、「プライベート」変数と「プロテクト」変数の違いを示す方法はありません。サブクラスがアクセスできるが、サブクラスがアクセスすることができるが、外部の世界はアクセスしない可能性がある。単一の末尾のアンダースコアを使用して '保護された'を意味し、二重のアンダースコアが 'プライベート'を意味する場合は、このような状況では便利な規則です(名前のマングリングによってサブクラスでサブクラスで同じ名前の変数を使用することはできません)衝突)。ダブル先頭と末尾のアンダースコア命名スタイルが特別な意味を持つ名前にのみ使用されることを意味しているので、

ダブルリードし、

self.__var1__アンダースコア末尾には、私は文字通りそれを書いたとして、あなたが作成することはありませんものです__init__または__eq__クラスのメソッドのように、Pythonで定義されています。クラスの振る舞いを変更するためにそれらをオーバーライドすることは自由です(実際にはほとんどすべてのクラスはプログラマが__init__と定義されています)。self.__var1__のような独自の名前を作るべきではありません。

+0

[docs](http://docs.python.org/2/reference/)にも詳しく記載されています。 lexical_analysis.html#reserved-class-of-identifiers)。 –

+1

"単一の先頭と末尾のアンダースコア":これは、ユーザーが変更可能な特別なメソッドに相当するものとして、いくつかのプロジェクトで使用されています。たとえば、[Sage](http://www.sagemath.org/doc/developer/coding_in_python.html#special-sage-functions)で使用します。私はそれを他の場所でも見たことがありますが、私は手を離れた例を考えることはできません。 – DSM

+0

**二重先頭アンダースコア**の最後の3行は、その逆にする必要があります。単一アンダースコア=プライベート、ダブルアンダースコア=保護 – amirteymuri

関連する問題