Pythonでこれらの違いは何ですか?
self._var1
self._var1_
self.__var1
self.__var1__
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
: クラス属性に名前を付けるときに、名前マングリングを呼び出します (クラス FooBar 内では、 に__boo
なり_FooBar__boo
ます。以下を参照してください)。
__double_leading_and_trailing_underscore__
: ユーザー制御の名前空間に存在する「魔法の」オブジェクトまたは属性。例えば__init__
、__import__
または__file__
。そのような名前を発明しないでください。文書化されたとおりにのみ使用してください。
ただし、クラス属性のコンテキストで質問したので、具体的な例を見てみましょう。
クラスの属性に名前をself._var1
付けることは、クラスのユーザーに、その属性はクラスの内部 (またはおそらくサブクラスの内部) のみがアクセスする必要があり、直接アクセスする必要はなく、おそらく変更すべきではないことを示します。private
Java や C# でorフィールドを使用するのと同じ場所で先頭のアンダースコアを使用する必要がありますがprotected
、言語が実際に非アクセスを強制するわけではないことに注意してください。代わりに、クラスのユーザーが愚かなことをしないことを信頼して、クラスのプライベート フィールドにアクセス (または変更) するオプションは、彼らが何をしているのかを知っていて、それが理にかなっていることを本当に確信している場合です。
self._var1_
私が今まで見たものではありません。この命名スタイルは、Python の世界では従来の意味を持たないと思います。
これには実際に構文上の重要性があります。self.__var1
クラスのスコープ内で from を参照すると、名前マングリングが呼び出されます。self._YourClassName__var1
クラスの外からは、変数はではなくat のように見えますself.__var1
。誰もがこれを使用しているわけではありません-私が働いている場所ではまったく使用していません-そして単純なクラスの場合、単一の先頭のアンダースコアを使用する代わりに、少しばかげてイライラするように感じます.
ただし、それが存在することには正当な理由があります。多くの継承を使用している場合、単一の先頭のアンダースコアのみを使用している場合、コードを読んでいる人に「プライベート」変数と「保護された」変数の違いを示す方法がありません-意味さえありませんサブクラスからアクセスできるものと、サブクラスはアクセスできるが外の世界はアクセスできないもの。したがって、「保護」を意味するために末尾の 1 つのアンダースコアを使用し、「プライベート」を意味するために 2 つのアンダースコアを使用することは、この状況では有用な慣例である可能性があります (名前マングリングにより、サブクラスはサブクラスで同じ名前の変数を使用することができます。衝突)。
self.__var1__
は、私が文字通り書いたように、絶対に作成してはならないものです。なぜなら、先頭と末尾に二重のアンダースコアを付ける命名スタイルは、クラスの__init__
またはメソッドのように、Python によって定義された特別な意味を持つ名前にのみ使用することを意図しているためです。__eq__
クラスの動作を変更するためにこれらを自由にオーバーライドできます (実際、ほとんどすべてのクラスにはプログラマー定義__init__
の があります) self.__var1__
。