In this article, we explore the object-oriented design and implementation of a Vehicle Rental System using Python3.
This system facilitates the renting of vehicles for short and long durations.
The Vehicle Rental System should:
- Vehicle Management: Handle various types of vehicles available for rent.
- User Account Management: Manage customer registrations and profiles.
- Rental Process: Enable users to rent and return vehicles.
- Pricing and Payment: Calculate rental charges and process payments.
- Reservation System: Support advance booking of vehicles.
- Adding and Managing Vehicles
- Registering and Managing User Accounts
- Renting and Returning Vehicles
- Calculating Rental Charges
- Handling Reservations
VehicleRentalSystem: Manages the overall system.User: Represents a system user or customer.Vehicle: Abstract class for various types of vehicles.Rental: Represents a vehicle rental transaction.
Represents a generic vehicle.
from abc import ABC, abstractmethod
class Vehicle(ABC):
def __init__(self, vehicle_id: str, model: str, rate_per_day: float):
self.vehicle_id = vehicle_id
self.model = model
self.rate_per_day = rate_per_day
# Python doesn't need explicit getters/setters unless additional processing is required.Manages user account information.
class User:
def __init__(self, user_id: str, name: str, driver_license_number: str):
self.user_id = user_id
self.name = name
self.driver_license_number = driver_license_numberRepresents a vehicle rental transaction.
from datetime import datetime
class Rental:
def __init__(self, rental_id: str, user: User, vehicle: Vehicle, rental_date: datetime):
self.rental_id = rental_id
self.user = user
self.vehicle = vehicle
self.rental_date = rental_date
self.return_date = None
self.total_charge = 0.0
def complete_rental(self, return_date: datetime):
self.return_date = return_date
self.total_charge = self.calculate_total_charge()
def calculate_total_charge(self) -> float:
rental_days = (self.return_date - self.rental_date).days
return rental_days * self.vehicle.rate_per_dayManages the vehicle rental system operations.
class VehicleRentalSystem:
def __init__(self):
self.users = []
self.vehicles = []
self.rentals = []
def add_user(self, user: User):
self.users.append(user)
def add_vehicle(self, vehicle: Vehicle):
self.vehicles.append(vehicle)
def rent_vehicle(self, user_id: str, vehicle_id: str, rental_date: datetime):
user = self.find_user_by_id(user_id)
vehicle = self.find_vehicle_by_id(vehicle_id)
if user and vehicle:
rental = Rental(self.generate_rental_id(), user, vehicle, rental_date)
self.rentals.append(rental)
return rental
return None
def return_vehicle(self, rental_id: str, return_date: datetime):
rental = self.find_rental_by_id(rental_id)
if rental:
rental.complete_rental(return_date)
def find_user_by_id(self, user_id: str):
for user in self.users:
if user.user_id == user_id:
return user
return None
def find_vehicle_by_id(self, vehicle_id: str):
for vehicle in self.vehicles:
if vehicle.vehicle_id == vehicle_id:
return vehicle
return None
def find_rental_by_id(self, rental_id: str):
for rental in self.rentals:
if rental.rental_id == rental_id:
return rental
return None
def generate_rental_id(self) -> str:
import time
return f"RENTAL_{int(time.time() * 1000)}"def main():
system = VehicleRentalSystem()
user = User("u123", "John Doe", "DL12345678")
vehicle = Vehicle("v123", "Toyota Camry", 45.0) # You will need to subclass Vehicle or modify it to be non-abstract
system.add_user(user)
system.add_vehicle(vehicle)
rental_date = datetime.now()
rental = system.rent_vehicle("u123", "v123", rental_date)
if rental:
print(f"Vehicle rented: {rental.vehicle.model}")
return_date = rental_date + timedelta(days=4)
system.return_vehicle(rental.rental_id, return_date)
if rental.total_charge > 0:
print(f"Total charge for the rental: ${rental.total_charge:.2f}")
if __name__ == "__main__":
main()