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.__tmp,python 在幕后对名称进行了修改,并解析为self._A__tmp因为tmpA该类的一种方法。你想要self._B__tmp。如果你重新定义了其中的tmp方法,B它会起作用,但这是一种愚蠢的做法,因为它违背了继承的目的之一——避免代码重复。

__private当您希望避免与子类的属性发生名称冲突时,保留使用变量。在这种情况下,您真的希望实现这样的命名冲突。

如果您想将属性设为私有,只需一个下划线即可,因为我们在这里都是同意的成年人

于 2013-07-30T13:17:58.543 回答
0

从描述中我不清楚,为什么应该被通缉并且应该有意义。看起来是一个相当奇怪的设计。但是,为什么不直接覆盖 getter 呢?

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 回答