48

重複の可能性:
Python でのオブジェクト名の前の単一アンダースコアと二重アンダースコアの意味

Pythonでこれらの違いは何ですか?

self._var1
self._var1_
self.__var1
self.__var1__
4

1 に答える 1

86

出発点として、おそらく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付けることは、クラスのユーザーに、その属性はクラスの内部 (またはおそらくサブクラスの内部) のみがアクセスする必要があり、直接アクセスする必要はなく、おそらく変更すべきではないことを示します。privateJava や 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__

于 2013-02-03T10:33:25.277 に答える