17

Python は、クラスのメソッドと属性にプライベートな名前マングルを提供します。

この機能が必要となる具体的なケースはありますか、それとも Java と C++ からの単なる継承ですか?

ある場合、Python の名前マングリングを使用する必要があるユース ケースを説明してください。

また、作成者が偶発的な外部属性アクセスを防止しようとしているだけの場合には興味がありません。このユース ケースは、Python プログラミング モデルと一致していないと思います。

4

4 に答える 4

30

内部属性への偶発的なアクセスを防ぐためです。次に例を示します。

ライブラリであるあなたのコードでは:

class YourClass:
    def __init__(self):
        self.__thing = 1           # Your private member, not part of your API

あなたのライブラリクラスから継承している私のコードでは:

class MyClass(YourClass):
    def __init__(self):
        # ...
        self.__thing = "My thing"  # My private member; the name is a coincidence

私的な名前のマ​​ングリングがなければ、私があなたの名前を誤って再利用すると、あなたのライブラリが壊れてしまいます.

于 2009-07-21T23:16:00.780 に答える
15

PEP 8から:

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

(強調を追加)

于 2009-07-21T23:16:38.033 に答える
-1

名前マングリングは、偶発的な外部属性アクセスを防ぐためにあります。ほとんどの場合、名前の衝突がないことを確認するためにあります。

于 2009-07-21T23:14:04.357 に答える