Полиморфизм в Python
Доброго дня. Начал изучать полиморфизм и возник такой вопрос. Есть три класса, которые являются дочерними по отношению к классу Divisions. Далее я создаю по одному объекту каждого класса. И эти объекты перечисляю в списке. Затем идя по списку, вызываю определённую функцию, которая имеет одинаковое название в классах. Если функция не определена в самом дочернем классе, то она срабатывает в базовом классе, генерируя ошибку. Код следующий:
class Divisions:
def get_info(self):
raise "Определите работу функции в дочернем классе!"
class Atlantic(Divisions):
def __init__(self, name):
self.name=name
def get_info(self):
return (f"Это команда под названием {self.name}")
class Center(Divisions):
def __init__(self, name):
self.name=name
def get_info(self):
return (f"Это команда под названием {self.name}")
class Capital(Divisions):
def __init__(self, name):
self.name = name
Carolina=Capital("Caroline")
Boston=Atlantic("Boston")
Dallas=Center("Dallas")
rew=[Carolina, Boston, Dallas]
for i in rew:
print (i.get_info())
ВОПРОС: Когда я запускаю код, то программа, после того, как сработал raise из базового класса, не перебирает оставшиеся элементы, не возвращает значение функций в оставшихся объектах. Как сделать, чтобы продолжала обрабатывать и возвращать? Спасибо.
Нейросеть выше правильно предложила ловить ошибку, но причина ошибки заключается в постановке задачи - если родительский класс должен кидать исключение, то с точки зрения логики задачи это означает, что происходит недопустимое поведение, т.е. в работающей программе не должно быть наследников, где бы не было кастомной реализации метода.
Соответственно, если существование таких наследников допускается, в том числе и для тестовых целей - то родительский класс НЕ ДОЛЖЕН кидать исключение, обрывая выполнение, а иным способом возвращать уведомление об отсутствии - например, писать в текстовый лог предупреждение. Механизм исключений - не способ реализации логики обработки.
Проблема, описанная вами, возникает из-за того, что при вызове функции get_info() для объекта определенного класса, если функция не определена в этом классе, то вызывается функция из базового класса Divisions, которая в свою очередь вызывает исключение raise. После вызова исключения программа завершает выполнение цикла и не возвращает значения для оставшихся объектов.
Для решения этой проблемы можно использовать конструкцию try-except, чтобы обработать исключение внутри цикла и продолжить выполнение программы.
class Divisions:
def get_info(self):
raise NotImplementedError("Определите работу функции в дочернем классе!")
class Atlantic(Divisions):
def __init__(self, name):
self.name = name
def get_info(self):
return f"Это команда под названием {self.name}"
class Center(Divisions):
def __init__(self, name):
self.name = name
def get_info(self):
return f"Это команда под названием {self.name}"
class Capital(Divisions):
def __init__(self, name):
self. name = name
Carolina = Capital("Carolina")
Boston = Atlantic("Boston")
Dallas = Center("Dallas")
rew = [Carolina, Boston, Dallas]
for i in rew:
try:
print(i.get_info())
except NotImplementedError as e:
print(e)
В данном случае, при вызове функции get_info() для каждого объекта в списке, мы используем конструкцию try-except. Если функция определена в классе, то она будет вызвана, и значение будет возвращено. Если функция не определена, будет сгенерировано исключение NotImplementedError, которое будет обработано except блоком, и программа продолжит выполнение, переходя к следующему объекту в списке.