Python:隐藏派生类中基类的成员

时间:2013-07-30 12:38:37

标签: python inheritance python-3.x member-hiding

如何覆盖派生类中的基类成员,以便访问此类成员会导致调用派生成员? 考虑下面的例子? __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

2 个答案:

答案 0 :(得分: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变量的使用。在这种情况下,你真的希望 achive 这样的命名冲突。

如果您想将属性设为私有,则只需使用一个下划线,因为we're all consenting adults here

答案 1 :(得分: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