Задача курса
Python: Диспетчер отчётов: полиморфный вызов без isinstance
Курс «Python для продвинутых: ООП, типизация и тестирование» · урок «Полиморфизм через общий интерфейс»
Условие
Диспетчер отчётов: полиморфный вызов без isinstance
Ты пишешь диспетчер отчётов для внутренней системы мониторинга. В системе появляются разные источники данных — каждый умеет генерировать текстовую сводку через метод report(). Диспетчер не должен знать конкретные классы: он просто вызывает report() у каждого объекта в списке.
Что уже дано
Проверяющая система ничего не создаёт заранее. Программа получает все данные через stdin и должна напечатать результат в stdout.
В редакторе есть незавершённый каркас с тремя классами и функцией-диспетчером.
Что нужно сделать
Допиши программу так, чтобы она:
- Определяла три класса —
ServerMetrics,DatabaseMetrics,QueueMetrics— каждый с методомreport(self) -> str, который возвращает строку по правилам ниже. - Определяла функцию
dispatch(sources: list) -> list[str], которая принимает список объектов и без каких-либо isinstance-проверок вызывает у каждого методreport(), собирая результаты в список строк. - Читала из
stdinзаписи и создавала объекты нужного класса, затем передавала список вdispatchи печатала каждую строку из результата.
Форматы метода report() для каждого класса:
ServerMetrics(host: str, cpu: float)→"Server {host}: CPU {cpu}%"DatabaseMetrics(name: str, queries: int)→"DB {name}: {queries} queries"QueueMetrics(topic: str, lag: int)→"Queue {topic}: lag {lag}"
Важно: функция dispatch не должна содержать isinstance, type() или любые условия, зависящие от типа объекта.
Ввод и вывод
Программа читает данные из stdin и печатает результат в stdout.
Формат ввода
Первая строка — целое число n (количество записей).
Каждая из следующих n строк содержит тип и параметры, разделённые пробелом:
server <host> <cpu>— host это строка без пробелов, cpu — вещественное числоdb <name> <queries>— name это строка без пробелов, queries — целое числоqueue <topic> <lag>— topic это строка без пробелов, lag — целое число
Формат вывода
n строк — результат вызова report() для каждого объекта в исходном порядке.
Примеры
Пример 1
- Ввод
4 server web-01 73.5 db orders 1200 queue payments 42 server db-backup 12.0
- Ожидаемый результат
Server web-01: CPU 73.5% DB orders: 1200 queries Queue payments: lag 42 Server db-backup: CPU 12.0%
