Практическое задание «ООП: наследование, инкапсуляция и полиморфизм» Привет! Домашняя работа по данной теме является продолжением квиза к предыдущей лекции. Мы продолжим реализовывать логику функционала учебной группы в парадигме ООП. Удачи!
Задание № 1. Наследование Исходя из квиза к предыдущему занятию, у нас уже есть класс преподавателей и класс студентов (вы можете взять этот код за основу или написать свой). Студентов пока оставим без изменения, а вот преподаватели бывают разные, поэтому теперь класс Mentor должен стать родительским классом, а от него нужно реализовать наследование классов Lecturer (лекторы) и Reviewer (эксперты, проверяющие домашние задания). Очевидно, имя, фамилия и список закрепленных курсов логично реализовать на уровне родительского класса. А чем же будут специфичны дочерние классы? Об этом в следующих заданиях. А пока можете проверить, что успешно реализовали дочерние классы
lecturer = Lecturer('Иван', 'Иванов') reviewer = Reviewer('Пётр', 'Петров') print(isinstance(lecturer, Mentor)) # True print(isinstance(reviewer, Mentor)) # True print(lecturer.courses_attached) # [] print(reviewer.courses_attached) # [] Задание № 2. Атрибуты и взаимодействие классов. В квизе к предыдущей лекции мы реализовали возможность выставлять студентам оценки за домашние задания. Теперь это могут делать только Reviewer (реализуйте такой метод)! А что могут делать лекторы? Получать оценки за лекции от студентов :) Реализуйте метод выставления оценок лекторам у класса Student (оценки по 10-балльной шкале, хранятся в атрибуте-словаре у Lecturer, в котором ключи – названия курсов, а значения – списки оценок). Лектор при этом должен быть закреплен за тем курсом, на который записан студент.
lecturer = Lecturer('Иван', 'Иванов') reviewer = Reviewer('Пётр', 'Петров') student = Student('Алёхина', 'Ольга', 'Ж')
student.courses_in_progress += ['Python', 'Java'] lecturer.courses_attached += ['Python', 'C++'] reviewer.courses_attached += ['Python', 'C++']
print(student.rate_lecture(lecturer, 'Python', 7)) # None print(student.rate_lecture(lecturer, 'Java', 8)) # Ошибка print(student.rate_lecture(lecturer, 'С++', 8)) # Ошибка print(student.rate_lecture(reviewer, 'Python', 6)) # Ошибка
print(lecturer.grades) # {'Python': [7]}
Задание № 3. Полиморфизм и магические методы Перегрузите магический метод str у всех классов. У проверяющих он должен выводить информацию в следующем виде:
print(some_reviewer) Имя: Some Фамилия: Buddy У лекторов:
print(some_lecturer) Имя: Some Фамилия: Buddy Средняя оценка за лекции: 9.9 А у студентов так:
print(some_student) Имя: Ruoy Фамилия: Eman Средняя оценка за домашние задания: 9.9 Курсы в процессе изучения: Python, Git Завершенные курсы: Введение в программирование Реализуйте возможность сравнивать (через операторы сравнения) между собой лекторов по средней оценке за лекции и студентов по средней оценке за домашние задания.
Задание № 4. Полевые испытания Создайте по 2 экземпляра каждого класса, вызовите все созданные методы, а также реализуйте две функции:
для подсчета средней оценки за домашние задания по всем студентам в рамках конкретного курса (в качестве аргументов принимаем список студентов и название курса); для подсчета средней оценки за лекции всех лекторов в рамках курса (в качестве аргумента принимаем список лекторов и название курса).
Критерии оценки домашнего задания Зачёт Задание №1 (Наследование): Созданы классы Lecturer и Reviewer, наследующие от Mentor. Проверка через isinstance() возвращает True. Атрибуты courses_attached корректно наследуются и инициализируются пустым списком.
Задание №2 (Атрибуты и взаимодействие классов): У Reviewer реализован метод выставления оценок студентам. У Student реализован метод rate_lecture(), который: Работает только для лекторов (Lecturer). Проверяет, что лектор прикреплен к курсу студента. Записывает оценки в словарь grades лектора. Ошибки обрабатываются корректно (как в примере). Задание №3 (Полиморфизм и магические методы): Перегружен str для всех классов (формат вывода соответствует условию). Реализовано сравнение (>, <, ==) лекторов и студентов по средней оценке. Задание №4 (Полевые испытания): Созданы по 2 экземпляра каждого класса. Проверены все методы (включая новые). Реализованы 2 функции: Подсчет средней оценки студентов по курсу. Подсчет средней оценки лекторов по курсу. На доработку Если хотя бы один из пунктов не выполнен или работает некорректно. Если код не соответствует PEP 8 (отступы, названия переменных, Docstrings и т. д.). Если сравнение (>, <, ==) не работает или работает неверно. Если функции для подсчета средних оценок не учитывают все переданные объекты или курс.