You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

156 lines
11 KiB
Plaintext

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"cells": [
{
"cell_type": "markdown",
"id": "0aeaec09",
"metadata": {},
"source": [
"# Задания про классы и наследование #"
]
},
{
"cell_type": "markdown",
"id": "a98c34eb",
"metadata": {},
"source": [
"Как правило задачи про классы носят не вычислительный характер. Обычно нужно написать классы, которые отвечают определенным интерфейсам. Насколько удобны эти интерфейсы и как сильно связаны классы между собой, определит легкость их использования в будущих программах.\n",
"\n",
"Предположим есть данные о разных автомобилях и спецтехнике. Данные представлены в виде таблицы с характеристиками. Обратите внимание на то, что некоторые колонки присущи только легковым автомобилям, например, кол-во пассажирских мест. В свою очередь только у грузовых автомобилей есть длина, ширина и высота кузова.\n",
"\n",
"| Тип (`car_type`) | Марка (`brand`) | Кол-во пассажирских мест (`passenger_seats_count`) | Фото (`photo_file_name`) | Кузов ДxШxВ, м (`body_whl`) | Грузоподъемность,Тонн (`carrying`) | Дополнительно (`extra`) |\n",
"|:----------------:|:---------------:|:--------------------------------------------------:|:------------------------:|:---------------------------:|:----------------------------------:|:-------------------------------:|\n",
"| car | Nissan xTtrail | 4 | f1.jpeg | - | 2.5 | - |\n",
"| truck | Man | - | f2.jpeg | 8x3x2.5 | 20 | - |\n",
"| car | Mazda 6 | 4 | f3.jpeg | - | 2.5 | - |\n",
"| spec_machine | Hitachi | - | f4.jpeg | - | 1.2 | Легкая техника для уборки снега |\n",
"\n",
"Вам необходимо создать свою иерархию классов для данных, которые описаны в таблице.\n",
"\n",
" - `CarBase`\n",
" - `Car(CarBase)`\n",
" - `Truck(CarBase)`\n",
" - `SpecMachine(CarBase)`\n",
"\n",
"У любого объекта есть обязательный атрибут `car_type`. Он означает тип объекта и может принимать одно из значений: `car`, `truck`, `spec_machine`.\n",
"\n",
"Также у любого объекта из иерархии есть фото в виде имени файла — обязательный атрибут `photo_file_name`.\n",
"\n",
"В базовом классе нужно реализовать метод `get_photo_file_ext` для получения расширения файла (\".png\", \".jpeg\" и т.д.) с фото. Расширение файла можно получить при помощи `os.path.splitext`.\n",
"\n",
"Для грузового автомобиля необходимо разделить характеристики кузова на отдельные составляющие `body_length`, `body_width`, `body_height`. Разделитель — латинская буква `x`. Характеристики кузова могут быть заданы в виде пустой строки, в таком случае все составляющие равны `0`. Обратите внимание на то, что характеристики кузова должны быть вещественными числами.\n",
"\n",
"Также для класса грузового автомобиля необходимо реализовать метод `get_body_volume`, возвращающий объем кузова в метрах кубических.\n",
"\n",
"Все обязательные атрибуты для объектов `Car`, `Truck` и `SpecMachine` перечислены в таблице ниже, где `1` - означает, что атрибут обязателен для объекта, `0` - атрибут должен отсутствовать.\n",
"\n",
"| - | Car | Truck | SpecMachine |\n",
"|-------------------------|:---:|:-----:|:-----------:|\n",
"| `car_type` | 1 | 1 | 1 |\n",
"| `photo_file_name` | 1 | 1 | 1 |\n",
"| `brand` | 1 | 1 | 1 |\n",
"| `carrying` | 1 | 1 | 1 |\n",
"| `passenger_seats_count` | 1 | 0 | 0 |\n",
"| `body_width` | 0 | 1 | 0 |\n",
"| `body_height` | 0 | 1 | 0 |\n",
"| `body_length` | 0 | 1 | 0 |\n",
"| `extra` | 0 | 0 | 1 |\n",
"\n",
"Далее необходимо реализовать функцию, на вход которой подается имя файла в формате **csv**. Файл содержит данные аналогичны строкам из таблицы. Вам необходимо прочитать этот файл построчно при помощи модуля стандартной библиотеки **csv**. Затем проанализировать строки и создать список нужных объектов с автомобилями и специальной техникой. Функция должна возвращать список объектов.\n",
"\n",
"Не важно как вы назовете свои классы, главное чтобы их атрибуты имели имена:\n",
"\n",
"```python\n",
"car_type\n",
"brand\n",
"passenger_seats_count\n",
"photo_file_name\n",
"body_width\n",
"body_height\n",
"body_length\n",
"carrying\n",
"extra\n",
"```\n",
"\n",
"И методы:\n",
"\n",
"`get_photo_file_ext` и `get_body_volume`\n",
"\n",
"У каждого объекта из иерархии должен быть свой набор атрибутов и методов. У класса легковой автомобиль не должно быть метода `get_body_volume` в отличие от класса грузового автомобиля.\n",
"\n",
"Функция, которая парсит строки входного массива, должна называться `get_car_list`. Для проверки работы своей реализации функции `get_car_list` и всех созданных классов вам необходимо использовать следующий csv-файл: `cars.csv`.\n",
"\n",
"Первая строка в исходном файле — это заголовок **csv**, который содержит имена колонок. Нужно пропустить первую строку из исходного файла. Обратите внимание на то, что исходный файл с данными содержит некорректные строки, которые нужно пропустить. Если возникают исключения в процессе создания объектов из строк **csv**-файла, то требуется их корректно обработать стандартным способом. Проверьте работу вашего кода с входным файлом.\n",
"\n",
"Пример чтения **csv** файла:\n",
"\n",
"```python\n",
"import csv\n",
"\n",
"with open(csv_filename) as csv_fd:\n",
" reader = csv.reader(csv_fd, delimiter=';')\n",
" next(reader) # пропускаем заголовок\n",
" for row in reader:\n",
" print(row)\n",
"```\n",
"\n",
"Также обратите внимание, что все значения в **csv** файле при чтении будут python-строками. Нужно преобразовать строку в `int` для `passenger_seats_count`, во `float` для carrying, а также во `float` для `body_width` `body_height`, `body_length`.\n",
"\n",
"Также ваша программа должна быть готова к тому, что в некоторых строках данные могут быть заполнены некорректно. Например, число колонок меньше . В таком случае нужно проигнорировать подобные строки и не создавать объекты. Строки с пустым значением для `body_whl` игнорироваться не должны. Вы можете использовать механизм исключений для обработки ошибок.\n",
"\n",
"Ниже приведен пример с заготовкой кода для выполнения задания.\n",
"\n",
"```python\n",
"class CarBase:\n",
" def __init__(self, brand, photo_file_name, carrying):\n",
" pass\n",
"\n",
"\n",
"class Car(CarBase):\n",
" def __init__(self, brand, photo_file_name, carrying, passenger_seats_count):\n",
" pass\n",
"\n",
"\n",
"class Truck(CarBase):\n",
" def __init__(self, brand, photo_file_name, carrying, body_whl):\n",
" pass\n",
"\n",
"\n",
"class SpecMachine(CarBase):\n",
" def __init__(self, brand, photo_file_name, carrying, extra):\n",
" pass\n",
"\n",
"\n",
"def get_car_list(csv_filename):\n",
" car_list = []\n",
" return car_list\n",
"```\n",
"\n",
"Вам необходимо расширить функционал исходных классов, дополнить методы нужным кодом и реализовать функцию `get_car_list`.\n",
"\n",
"Успехов!"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}