2

重複の可能性:
Python でのプライベート名マングリングの利点は何ですか?

Python で遊んでいるときに、ifclassまたはinstancevariable-name が 2 つのアンダースコアで始まる場合、名前の前に「_」が付くように名前が変更されることがわかりました。

例えば

class Test(object):
    __attribute = "dunderscored"
    def __init__(self, value=0):
        self.__instance_attribute = value


test_instance = Test()

次に、両方の変数の名前が次のように変更されます

test_instance._Test__attributetest_instance._Test__instance_attribute

なぜそのような動作/機能があるのですか? その必要性、またはそれを意図した特別な用途はありますか?

さまざまなクラスに一般的な名前の属性がある場合のユースケースを考えることができます。値、id、メンバーは共通ですが、一部の関数/メソッドについては、これらのクラスの 1 つだけを期待/想定しています。この場合、型チェックが行われていない可能性があり、別のクラス インスタンスが渡されたときに (おそらく誤って) エラーや望ましくない動作が発生する可能性があります。

しかし、この使用例を除けば、この特別な動作の利点は見当たりません。この動作は機能のように見えますが、かなり基本的なものであり、ここで何かが欠けているように感じます。それが機能である場合、それは何に使用されますか?典型的なユースケースはありますか?

4

2 に答える 2

3

接頭辞の二重アンダースコアの使用は、名前マングリングと呼ばれます:( Pythonドキュメントから):

フォームの識別子__spam(少なくとも2つの先頭のアンダースコア、最大で1つの末尾のアンダースコア)は、テキストで。に置き換えられます_classname__spam。ここで、classnameは、先頭のアンダースコアが削除された現在のクラス名です。このマングリングは、識別子の構文上の位置に関係なく行われるため、クラスプライベートインスタンスとクラス変数、メソッド、グローバルに格納された変数、さらにはインスタンスに格納された変数を定義するために使用できます。他のクラスのインスタンスでは、このクラスにプライベートです。

変数/関数/クラスをプライベートにする必要があることを示すために、単一のアンダースコアプレフィックスが使用されていることに注意してください(厳密には強制されていませんが)

于 2012-12-14T14:20:45.863 に答える
1

この機能は、サブクラス化時に属性との名前の衝突を回避するのに役立ちます。

次の点を考慮してください。

class MyClass1(object):
    def __init__(self):
         self.__attribute = 3

    def doSomething(self):
         print(self.__attribute)

class MyClass2(MyClass1):
    def __init__(self):
         MyClass1.__init__(self)
         self.__attribute = 4

    def doSomething2(self):
         print(self.__attribute)

インスタンスを作成する場合:

x = MyClass2()
x.doSomething() #prints 3
x.doSomething2() #prints 4

MyClassこれは基本的に、親クラスの動作の一部 ( ) を子クラスの動作 ( ) からMyClass2分離するために使用できます。

于 2012-12-14T14:24:04.043 に答える