Python: скрыть член базового класса в производном классе
Как переопределить член базового класса в моем производном классе, чтобы доступ к такому члену вызывал вызов производного члена? Рассмотрим следующий пример? __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 ответа
Не используйте запутанные имена переменных:
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
скрыт от имени питона и решает self._A__tmp
поскольку tmp
это метод A
учебный класс. Вы хотели self._B__tmp
, Если бы вы пересмотрели tmp
метод в B
это бы сработало, но это глупый способ сделать это, так как он побеждает одну из целей наследования - избегание дублирования кода.
Зарезервируйте использование __private
переменные для случаев, когда вы хотите избежать конфликтов имен с атрибутами подклассов. В этом случае вы действительно хотите добиться такого именования.
Если вы хотите сделать атрибут приватным, то достаточно подчеркнуть его одним знаком, поскольку мы все здесь взрослые.
Из описания мне не понятно, зачем нужно и должно иметь смысл. Похоже, довольно странный дизайн. Но тем не менее, почему бы вам просто не переписать получатель?
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