Top.Mail.Ru
{"error":{"code":"m-01","message":"config, error while trying to retrieve: unable to make request to Omicron: Get \"https://omicronapi.mail.ru/api/v1/get?config_id=otvet_mytracker\": dial tcp 217.69.140.121:443: connect: connection refused"}}
Ответы

Полиморфизм в 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 блоком, и программа продолжит выполнение, переходя к следующему объекту в списке.