如何覆盖派生类中的基类成员,以便访问此类成员会导致调用派生成员?
考虑下面的例子? __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
答案 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
,因为tmp
是A
类的方法。你想要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