Сервис аренды транспорта
Часть раздела Object Oriented Programming путешествия по Python на Coddy — урок 64 из 64.
Задание
СреднеВ этом испытании вы реализуете систему проката транспортных средств. Система моделирует транспортные средства, аренду и агентство по прокату с использованием надлежащего наследования и инкапсуляции.
vehicle.py— Реализуйте базовый класс Vehiclecar.py— Реализуйте подкласс Carmotorcycle.py— Реализуйте подкласс Motorcyclerental.py— Реализуйте класс Rentalrentalagency.py— Реализуйте класс RentalAgency
Каждый файл содержит подробные комментарии TODO, которые помогут вам в реализации. Следуйте этим комментариям, чтобы ваш код соответствовал всем требованиям.
Шпаргалка
Эта задача сосредоточена на реализации системы проката транспортных средств с использованием принципов объектно-ориентированного программирования, включая наследование и инкапсуляцию. Система состоит из нескольких классов, работающих вместе для моделирования полноценного арендного бизнеса.
Реализация включает в себя создание:
- Базового класса
Vehicleс общими свойствами и методами - Подклассов
CarиMotorcycle, которые наследуются от Vehicle - Класса
Rentalдля управления отдельными транзакциями по аренде - Класса
RentalAgencyдля координации всей системы проката
Попробуйте сами
from vehicle import Vehicle
from car import Car
from motorcycle import Motorcycle
from rental import Rental
from rentalagency import RentalAgency
# Обработчик комплексных тестовых случаев
test_case = input()
if test_case == "create_vehicles":
# Тест создания транспортных средств
car = Car("C123", "Toyota", "Camry", 50, 5)
bike = Motorcycle("M456", "Honda", "CBR", 35, 600)
print(car)
print(bike)
elif test_case == "rental_workflow":
# Тест рабочего процесса аренды
agency = RentalAgency("Quick Rentals")
# Добавление транспортных средств
car = Car("C123", "Toyota", "Camry", 50, 5)
bike = Motorcycle("M456", "Honda", "CBR", 35, 600)
agency.add_vehicle(car)
agency.add_vehicle(bike)
# Проверка доступных транспортных средств
print(f"Available before rental: {len(agency.available_vehicles())}")
# Аренда транспортного средства
rental_id = agency.rent_vehicle("C123", "John Doe", 3)
print(f"Rental created: {rental_id}")
# Проверка доступных транспортных средств после аренды
print(f"Available after rental: {len(agency.available_vehicles())}")
# Возврат транспортного средства
agency.return_vehicle(rental_id)
# Проверка доступных транспортных средств после возврата
print(f"Available after return: {len(agency.available_vehicles())}")
elif test_case == "rental_cost":
# Тест расчета стоимости аренды
car = Car("C123", "Toyota", "Camry", 50, 5)
rental = Rental("R1", car, "John Doe", 3)
print(f"Rental cost for 3 days: ${rental.calculate_cost()}")
elif test_case == "vehicle_methods":
# Тест методов Vehicle
vehicle = Vehicle("V789", "Generic", "Vehicle", 25)
print(vehicle)
print(f"Start rental: {vehicle.start_rental()}")
print(f"Start rental again: {vehicle.start_rental()}")
print(f"End rental: {vehicle.end_rental()}")
print(f"Start rental after end: {vehicle.start_rental()}")
elif test_case == "inheritance_check":
# Тест отношений наследования
car = Car("C123", "Toyota", "Camry", 50, 5)
bike = Motorcycle("M456", "Honda", "CBR", 35, 600)
print(f"Car is a Vehicle: {isinstance(car, Vehicle)}")
print(f"Motorcycle is a Vehicle: {isinstance(bike, Vehicle)}")
print(f"Car is a Motorcycle: {isinstance(car, Motorcycle)}")
elif test_case == "polymorphism":
# Тест полиморфного поведения
vehicles = [
Vehicle("V789", "Generic", "Vehicle", 25),
Car("C123", "Toyota", "Camry", 50, 5),
Motorcycle("M456", "Honda", "CBR", 35, 600)
]
for i, v in enumerate(vehicles):
print(f"Vehicle {i+1}: {v}")
elif test_case == "rental_edge_cases":
# Тест граничных случаев аренды
agency = RentalAgency("Edge Rentals")
# Попытка арендовать несуществующее транспортное средство
print(f"Rent non-existent: {agency.rent_vehicle('X999', 'John Doe', 3)}")
# Добавление автомобиля и его аренда
car = Car("C123", "Toyota", "Camry", 50, 5)
agency.add_vehicle(car)
rental_id = agency.rent_vehicle("C123", "John Doe", 3)
print(f"Valid rental: {rental_id}")
# Попытка снова арендовать тот же автомобиль
print(f"Rent unavailable car: {agency.rent_vehicle('C123', 'Jane Smith', 2)}")
# Попытка вернуть несуществующую аренду
print(f"Return non-existent rental: {agency.return_vehicle('R999')}")
# Возврат действительной аренды
print(f"Return valid rental: {agency.return_vehicle(rental_id)}")
# Попытка снова вернуть ту же аренду
print(f"Return completed rental: {agency.return_vehicle(rental_id)}")
elif test_case == "agency_operations":
# Тест комплексных операций агентства
agency = RentalAgency("Full Service Rentals")
# Добавление 5 транспортных средств
vehicles = [
Car("C1", "Toyota", "Camry", 50, 5),
Car("C2", "Honda", "Accord", 55, 5),
Car("C3", "Ford", "Focus", 45, 5),
Motorcycle("M1", "Honda", "CBR", 35, 600),
Motorcycle("M2", "Yamaha", "R1", 40, 1000)
]
for v in vehicles:
agency.add_vehicle(v)
print(f"Available vehicles: {len(agency.available_vehicles())}")
# Аренда 3 транспортных средств
rental_ids = [
agency.rent_vehicle("C1", "Customer 1", 3),
agency.rent_vehicle("C2", "Customer 2", 5),
agency.rent_vehicle("M1", "Customer 3", 2)
]
print(f"Available after rentals: {len(agency.available_vehicles())}")
# Возврат 2 транспортных средств
agency.return_vehicle(rental_ids[0])
agency.return_vehicle(rental_ids[1])
print(f"Available after returns: {len(agency.available_vehicles())}")
# Вывод доступных транспортных средств
print("Available vehicles:")
for v in agency.available_vehicles():
print(f" {v}")
elif test_case == "stress_test":
# Стресс-тест с большим количеством транспортных средств
agency = RentalAgency("Stress Test Rentals")
# Добавление 100 транспортных средств
for i in range(100):
if i % 2 == 0:
vehicle = Car(f"C{i}", "Make{i}", f"Model{i}", 50, 5)
else:
vehicle = Motorcycle(f"M{i}", "Make{i}", f"Model{i}", 35, 600)
agency.add_vehicle(vehicle)
# Аренда 50 транспортных средств
rental_ids = []
for i in range(50):
vin = f"C{i*2}" if i % 2 == 0 else f"M{i*2-1}"
rental_id = agency.rent_vehicle(vin, f"Customer{i}", 3)
rental_ids.append(rental_id)
print(f"Available after 50 rentals: {len(agency.available_vehicles())}")
# Возврат всех аренд
for rental_id in rental_ids:
agency.return_vehicle(rental_id)
print(f"Available after all returns: {len(agency.available_vehicles())}")
elif test_case == "invalid_inputs":
# Тест с некорректными входными данными
car = Car("C123", "Toyota", "Camry", -50, 5)
print(f"Car with negative rate: {car}")
bike = Motorcycle("M456", "Honda", "CBR", 35, 0)
print(f"Motorcycle with zero engine: {bike}")
rental_zero = Rental("R1", car, "John Doe", 0)
print(f"Rental with zero days cost: ${rental_zero.calculate_cost()}")
rental_neg = Rental("R2", car, "Jane Smith", -3)
print(f"Rental with negative days cost: ${rental_neg.calculate_cost()}")Все уроки раздела Object Oriented Programming
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыПараметр selfМетодыАтрибутыМетод-конструктор (__init__)Повторение — Простой калькулятор4Наследование
Базовое наследованиеФункция super()Переопределение методовМножественное наследованиеПорядок разрешения методовИтоги — Иерархия сотрудников7Специальные методы
Введение в магические методыПерегрузка операторовМагические методы контейнеровПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy13Финальные испытания
Платформа онлайн-обученияБанковская системаРазработка игрового персонажаСервис аренды транспорта5Полиморфизм
Снова о переопределении методовУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовИтоги — Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияМиксиныСтатические методы и методы классаДекораторы классовМенеджеры контекста11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Свойства классов
Переменные экземпляра и классаДекораторы свойствПриватные атрибутыИтоги — Менеджер банковского счета6Инкапсуляция
Public, Protected, Private члены классаМодификаторы доступаСокрытие данныхДекораторы property: продвинутый уровеньИтоги: Система учета студентов12Проект: Управление библиотекой
Обзор проектаКлассы Book и User