Ваша проблема в том, что двойные подчеркивания особые в python и создают некоторую частную жизнь (не применяется, но это искажает имена, что и влияет на вас здесь).Вы должны воссоздать это без переменной с двойным подчеркиванием.Кроме того, вы должны использовать super
вместо явного вызова A.__init__
:
>>> class A(object):
... def __init__(self):
... self.value = 1
... def get_value(self):
... return self.value
...
>>> class B(A):
... def __init__(self):
... super(B, self).__init__()
... self.value = 2
...
>>> b = B()
>>> b.get_value()
2
Для получения дополнительной информации, если вы не хотите читать ссылочную документацию:
Если вы читаетессылка на «специальный» выше, этот параграф описывает внутреннее искажение имени, которое происходит, когда вы используете __
.Короткий ответ: A.get_value()
возвращает _A__value
, а установка self.__value
в B
фактически устанавливает переменную-член с именем _B__value
, что означает, что A.get_value()
никогда ее не увидит.
Вы можете доказать это себе, действительно делая что-то действительно хинки:
>>> class A(object):
... def get_value(self):
... return self._B__value
...
>>> class B(A):
... def __init__(self):
... self.__value = 2
...
>>> b = B()
>>> b.get_value()
2