Menu
CoddyTech

Сервис аренды автомобилей

Часть раздела Объектно-ориентированное программирование путешествия по 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()}")

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Python