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

Python:在派生类中隐藏基类的成员,python,inheritance,python-3.x,member-hiding,Python,Inheritance,Python 3.x,Member Hiding,如何重写派生类中基类的成员,以便访问此类成员时调用派生成员? 想想例子吧?code>\uu 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__(s

如何重写派生类中基类的成员,以便访问此类成员时调用派生成员? 想想例子吧?code>\uu 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()) # Works as expected
问题是,
self.\uuuTMP
是python在幕后损坏的名称,并解析为
self.\uA\uTMP
,因为
tmp
A
类的一种方法。你想要
self.\u B\u tmp
。如果您在
B
中重新定义了
tmp
方法,它会起作用,但这样做是愚蠢的,因为它破坏了继承的目的之一——避免代码重复

保留使用
\u private
变量,以避免名称与子类的属性冲突。在这种情况下,您确实希望实现这样的命名冲突


如果要将属性设置为私有属性,只需一个下划线就足够了,因为。

从描述中,我不清楚为什么需要该属性,并且应该有意义。 看起来是个很奇怪的设计。不过,为什么不覆盖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

实现这两个目标是没有意义的。这只是不必要的工作。此设计的目标是拥有一个基类
a
,它提供一些名称(
\uu tmp
)。子类可以定义自己的名称,也可以接受基类的名称。然而,访问此文件必须返回正确的文件。谢谢,这很有效!模糊化变量名的确切含义是什么?本例中的双下划线或仅
tmp
?在一个属性上使用两个前导下划线会导致其名称损坏。这在(搜索“前导下划线”)中有详细说明。
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