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
Другие вопросы по тегам