Сервис аренды транспорта
Часть раздела Object Oriented Programming путешествия по Python на Coddy — урок 64 из 64.
Задание
СреднеВ этом испытании вы реализуете систему проката транспортных средств. Система моделирует транспортные средства, аренду и агентство по прокату с использованием надлежащего наследования и инкапсуляции.
vehicle.py— Реализуйте базовый класс Vehiclecar.py— Реализуйте подкласс Carmotorcycle.py— Реализуйте подкласс Motorcyclerental.py— Реализуйте класс Rentalrentalagency.py— Реализуйте класс RentalAgency
Каждый файл содержит подробные комментарии TODO, которые помогут вам в реализации. Следуйте этим комментариям, чтобы ваш код соответствовал всем требованиям.
Попробуйте сами
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Система выдачи книгФункционал поискаИнтерфейс администратораТестирование и интеграция