Наследование конструктора, переназначение метода

class human:
    def __init__(self, name = '', age = 0):
      self.__age = age
      self.__name = name

    def set_name(self):
      name = str(input("Name: "))
      self.__name = name
      
    def set_age(self):
      age = int(input("-> "))
      if age >= 1 and age <= 100:
          self.__age = age
      else:
          raise ValueError("Недопустимый возраст")

    def get_age(self):
      return self.__age

    def get_name(self):
      return self.__name

class teacher(human):
    def __init__(self, spec = ''):
      self.__specification = spec
      
      super().__init__(name = '', age = 0)

    def set_spec(self):
      spec = str(input('-> '))
      self.__specification = spec

    def set_age(self):
      age = int(input("age: ")) 
      if age >= 1 and age <= 100:
          self.__age = age
      else:
          raise ValueError("Недопустимый возраст")
    
    def get_spec(self):
      return self.__specification

if __name__ == "__main__":
  test = teacher()
  test.set_name()
  test.set_age()
  test.set_spec()
  print(test.get_name(), test.get_age(), test.get_spec())

Класс учитель наследует human с его конструктором и так-же я захотел переназначить метод set_age, но проблема в том что при переназначения метода поле self.__age устанавливает значение по умолчанию, а не то которое я ввёл, в чем моя ошибка?

введите сюда описание изображения


Ответы (1 шт):

Автор решения: n1tr0xs

Это происходит потому что вы используете так называемые приватные переменные (хоть на самом деле в python они таковыми не являются).

Для имен переменных, которые учавствуют в наследовании (сетеры и гетеры, которых вы хотите переопределить), в качестве метки приватности следует использовать _ в начале имени, а не __.

То есть _age, _specification, _name.


Либо же придется каждый метод get_.. переписывать ручками.

→ Ссылка