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, которые помогут вам в реализации. Следуйте этим комментариям, чтобы ваш код соответствовал всем требованиям.

Шпаргалка

Эта задача сосредоточена на реализации системы проката транспортных средств с использованием принципов объектно-ориентированного программирования, включая наследование и инкапсуляцию. Система состоит из нескольких классов, работающих вместе для моделирования полноценного арендного бизнеса.

Реализация включает в себя создание:

  • Базового класса 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