Menu
Coddy logo textTech

Сервис аренды транспорта

Часть раздела Object Oriented Programming путешествия по Python на Coddy — урок 64 из 64.

challenge icon

Задание

Средне

В этом испытании вы реализуете систему проката транспортных средств. Система моделирует транспортные средства, аренду и агентство по прокату с использованием надлежащего наследования и инкапсуляции.

  • vehicle.py — Реализуйте базовый класс Vehicle
  • car.py — Реализуйте подкласс Car
  • motorcycle.py — Реализуйте подкласс Motorcycle
  • rental.py — Реализуйте класс Rental
  • rentalagency.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