5

次のコードはエラーを生成します。

class A(object):
    def say_something(self):
        print(self.foo)
        print(self.__bar)

class B(A):
    def __init__(self):
        self.foo = 'hello'
        self.__bar = 'world'

test = B()
test.say_something()

「hello」の出力は成功しますが、「world」は次のエラーを生成します。

    print(self.__bar)

AttributeError: 'B' オブジェクトには属性 '_A__bar' がありません

私はこれに驚いています。親クラスに、その子が持つことが保証されているプラ​​イベート属性にアクセスできるメソッドを持たせたいと思っています。この問題を解決する標準的な方法はありますか?

4

3 に答える 3

12

を使用self._B__somethingしてアクセスできます。しかし、これはyuoがすべきことではありません。適切な解決策は、名前を に変更__barすること_barです。

二重アンダースコア名マングリングの背後にある考え方は、サブクラス/スーパークラスとの競合を回避することです。プライベート変数に使用することを意図したものではありません。変数をプライベート/内部と見なす必要がある場合は、先頭にアンダースコアを 1 つ付けます。これにより特別な処理が行われることはありませんが、すべての Python 開発者は、その変数を含むクラス/モジュールのパブリック API の一部ではないことを知っています。

于 2012-05-29T22:39:04.817 に答える
1

名前のマングリングです。2 つのアンダースコアで始まるメンバーはすべて、Python でマングルされた名前になります。あなたのコードは、2 つのアンダースコアで始まらない限り、他のどのメンバーでも機能します。

于 2012-05-29T22:40:19.350 に答える
-1

コードに何かが欠けているのではないかと思います.クラスAにもクラスBにも__barがありません..

于 2012-05-29T22:39:35.547 に答える