67

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

Python のプライベート メンバーとメソッドには、(_fooアンダースコア) と(ダブル アンダースコア) のどちらを使用すればよいですか?__bar

4

4 に答える 4

70

Python には「プライベート メソッド」などというものがないことに注意してください。二重アンダースコアは単なる名前マングリングです:

>>> class A(object):
...     def __foo(self):
...         pass
... 
>>> a = A()
>>> A.__dict__.keys()
['__dict__', '_A__foo', '__module__', '__weakref__', '__doc__']
>>> a._A__foo()

したがって、__接頭辞はマングリングが発生する必要がある場合に役立ちます。たとえば、継承チェーンの上または下の名前と衝突しないようにするためです。他の用途では、単一のアンダースコアの方が良いでしょう、IMHO。

EDIT、の混乱に関して__PEP-8はそれについて非常に明確です:

クラスがサブクラス化されることを意図しており、サブクラスで使用したくない属性がある場合は、先頭にアンダースコアを 2 つ付け、末尾にアンダースコアを付けない名前を付けることを検討してください。これにより、Python の名前マングリング アルゴリズムが呼び出され、クラスの名前が属性名にマングルされます。これにより、サブクラスに誤って同じ名前の属性が含まれる場合に、属性名の衝突を回避できます。

注 3: 誰もが名前マングリングを好むわけではありません。偶発的な名前の衝突を避ける必要性と、高度な発信者が使用する可能性とのバランスを取るようにしてください。

したがって、サブクラスが誤って同じ名前の独自のメソッドを再定義することが予想されない場合は、使用しないでください。

于 2010-08-02T05:51:50.807 に答える
42

二重下線。クラスの外部から単純にアクセスできないように名前を壊します__fieldName。これは、それらを非公開にする場合に最初に行いたいことです。(ただし、フィールドへのアクセスはそれほど難しくありません。)

class Foo:
    def __init__(self):
        self.__privateField = 4;
        print self.__privateField # yields 4 no problem

foo = Foo()
foo.__privateField
# AttributeError: Foo instance has no attribute '__privateField'

代わりに からアクセスできます_Foo__privateField。しかし、「I'M PRIVATE DON'T TOUCH ME」と叫びます。これは、何もないよりはましです。

于 2010-08-02T05:49:34.870 に答える
9

二重下線。それは名前を台無しにします。変数には引き続きアクセスできますが、一般的にそうするのはお勧めできません。

セミプライベートには単一のアンダースコアを使用し (python 開発者に「絶対に必要な場合にのみ変更する」ことを伝えます)、完全にプライベートには二重にします。

于 2010-08-02T05:51:51.367 に答える
-4

それはコーディング規約だからです。詳しくはこちらをご覧ください。

于 2010-08-02T05:52:29.653 に答える