"""Object-Oriented Programming: Airline Reservation System example === CSC148 Winter 2021 === Department of Mathematical and Computational Sciences, University of Toronto Mississauga === Module description === This module contains two sample classes Seat and ReservationSystem that we developed as a way to demonstrate concepts in object-oriented programming. """ from __future__ import annotations # Reference: 1.4 Type Annotations import random from typing import List # Python library for expressing complex types class Seat: """ An airplane seat. The Seat class is optional and you can implement the reservation system without it. But it makes the ReservationSystem class a bit neater. === Attributes === name: a string representing the seats name class_type: a string representing the class type of the seat reserved: True iff this seat has been reserved """ name: str class_type: str reserved: bool def __init__(self: Seat, seat_name: str, class_type: str) -> None: """Initialize a new Seat.""" self.name = seat_name self.class_type = class_type self.reserved = False def __repr__(self: Seat) -> str: """ Return a string representation of this seat by its name and class type """ return "Seat {0} {1}".format(self.name, self.class_type) class ReservationSystem: """ An airline reservation system. === Attributes === all_b_seats: a list of all the business class seats all_e_seats: a list of all the economy class seats vacant_b_seats: a list of vacant business class seats vacant_e_seats: a list of vacant economy class seats reserved_b_seats: a list of reserved business class seats reserved_e_seats: a list of reserved economy class seats booking_ids: a list of strings representing booking ids """ all_b_seats: List[Seat] all_e_seats: List[Seat] vacant_b_seats: List[Seat] vacant_e_seats: List[Seat] reserved_b_seats: List[Seat] reserved_e_seats: List[Seat] booking_ids: List[str] def __init__(self: ReservationSystem, b_seats: List[Seat], e_seats: List[Seat]) -> None: """Initialize a new ReservationSystem.""" self.all_b_seats = b_seats[:] self.all_e_seats = e_seats[:] self.vacant_b_seats = b_seats[:] self.vacant_e_seats = e_seats[:] self.reserved_b_seats = [] self.reserved_e_seats = [] self.booking_ids = [] def make_reservation(self: ReservationSystem, preference: str) -> str: """ Book a random seat in the given preference class and return the seat number and booking id if booking is successful. Otherwise, return an error message. Precondition: preference is either "business" or "economy" """ # generate a random booking id # we use '_' in the for loops because the variable is unused booking_id = "".join(random.choice("123456789ABCDEF") for _ in range(4)) while booking_id in self.booking_ids: booking_id = "".join( random.choice("123456789ABCDEF") for _ in range(4)) self.booking_ids.append(booking_id) if preference == "business" and self.vacant_b_seats != []: # to book a random seat, # use pop(random.randint(0, len(self.vacant_b_seats) - 1) # instead of pop(0), # which chooses the first available seat from the front seat = self.vacant_b_seats.pop(0) seat.class_type = "business" seat.reserved = True self.reserved_b_seats.append(seat) message = "You have successfully reserved seat " + str(seat) + \ ". Your reservation id is: " + booking_id elif preference == "economy" and self.vacant_e_seats != []: # to book a random seat, # use pop(random.randint(0, len(self.vacant_e_seats) - 1) # instead of pop(0), # which chooses the first available seat from the front seat = self.vacant_e_seats.pop(0) seat.class_type = "economy" seat.reserved = True self.reserved_e_seats.append(seat) message = "You have successfully reserved seat " + str(seat) + \ ". Your reservation id is: " + booking_id else: message = "Reservation was unsuccessful as no seats are " + \ "available for the specified preference" return message def get_reservation_percentage(self: ReservationSystem, seat_class: str) -> str: """ Return the percentage of seats booked in the specified seat_class Precondition: seat_class has one of three values: "all", "economy", or "business" """ if seat_class == "all": num = len(self.reserved_b_seats) + len(self.reserved_e_seats) denom = len(self.all_b_seats) + len(self.all_e_seats) elif seat_class == "business": num = len(self.reserved_b_seats) denom = len(self.all_b_seats) else: num = len(self.reserved_e_seats) denom = len(self.all_e_seats) return str((num / denom) * 100) + "%" def __repr__(self: ReservationSystem) -> str: """ Return a string representation of this reservation system by displaying the seats and whether they are reserved or available. """ aircraft = "" for seat in self.all_b_seats: aircraft += str(seat) aircraft += " Reserved" if seat.reserved else " Available" aircraft += "\n" for seat in self.all_e_seats: aircraft += str(seat) aircraft += " Reserved" if seat.reserved else " Available" aircraft += "\n" return aircraft[:-1] if __name__ == "__main__": import python_ta python_ta.check_all( config={ 'extra-imports': ['typing', 'random']}) business_seats = [Seat('1A', 'business'), Seat('1B', 'business'), Seat('1C', 'business'), Seat('1D', 'business')] economy_seats = [Seat('2A', 'economy'), Seat('2B', 'economy'), Seat('2C', 'economy'), Seat('2D', 'economy'), Seat('3A', 'economy'), Seat('3B', 'economy'), Seat('3C', 'economy'), Seat('3D', 'economy')] reservation_system = ReservationSystem(business_seats, economy_seats) reservation_system.make_reservation("business") reservation_system.make_reservation("economy") reservation_system.make_reservation("economy") reservation_system.make_reservation("economy") reservation_system.make_reservation("business") print("Percentage of booked seats: ", reservation_system.get_reservation_percentage("all")) print("Percentage of booked business seats: ", reservation_system.get_reservation_percentage("business")) print("Percentage of booked economy seats: ", reservation_system.get_reservation_percentage("economy"))