1

派生クラスの基本クラスのメンバーをオーバーライドして、そのようなメンバーへのアクセスによって派生メンバーが呼び出されるようにする方法は? 次の例を検討してください。__tmpで上書きされB、への呼び出しの場合に返される必要がありますtmp()

class A:
    __tmp = {"A" : 1,
             "B" : 2}
    def tmp(self):
        return self.__tmp

class B(A):
    __tmp = {"A" : 10,
             "B" : 20}
    def __init__(self):
        super().__init__()

b = B()
print(b.tmp()) # Expect to print {'A': 10, 'B': 20} here
4

2 に答える 2

3

難読化された変数名を使用しないでください。

class A:
    _tmp = {"A" : 1,
             "B" : 2}
    def tmp(self):
        return self._tmp

class B(A):
    _tmp = {"A" : 10,
             "B" : 20}
    def __init__(self):
        super().__init__()

b = B()
print(b.tmp()) # Works as expected

問題は、self.__tmpPython によって舞台裏で名前がマングルされ、クラスのメソッドであるself._A__tmpため解決されることでした。あなたが欲しかった。その中のメソッドを再定義していればうまくいきますが、それは継承の目的の 1 つ、つまりコードの重複を回避することを無効にするため、ばかげた方法です。tmpAself._B__tmptmpB

サブクラスの属性との名前の衝突を避け__privateたい場合に備えて、変数の使用を予約してください。この場合、そのような命名衝突を達成したいと本当に思っています。

属性を非公開にしたい場合は、アンダースコアが 1 つあれば十分です

于 2013-07-30T13:17:58.543 に答える
0

説明からは、なぜ必要なのか、理にかなっているのかがはっきりしません。かなり変わったデザインに見えます。それにもかかわらず、ゲッターを上書きしてみませんか?

class A( object ):
    __tmp = {"A" : 1,
             "B" : 2}
    def tmp( self ):
        return self.__tmp

class B( A ):
    __tmp = {"A" : 10,
             "B" : 20}
    def __init__( self ):
        super( B, self ).__init__()

    def tmp( self ):
        return B.__tmp


b = B()
print( b.tmp() )  # Expect to print {'A': 10, 'B': 20} here
于 2013-07-30T13:18:36.573 に答える