parking_lot.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. from abc import ABCMeta, abstractmethod
  2. from enum import Enum
  3. class VehicleSize(Enum):
  4. MOTORCYCLE = 0
  5. COMPACT = 1
  6. LARGE = 2
  7. class Vehicle(metaclass=ABCMeta):
  8. def __init__(self, vehicle_size, license_plate, spot_size):
  9. self.vehicle_size = vehicle_size
  10. self.license_plate = license_plate
  11. self.spot_size
  12. self.spots_taken = []
  13. def clear_spots(self):
  14. for spot in self.spots_taken:
  15. spot.remove_vehicle(self)
  16. self.spots_taken = []
  17. def take_spot(self, spot):
  18. self.spots_taken.append(spot)
  19. @abstractmethod
  20. def can_fit_in_spot(self, spot):
  21. pass
  22. class Motorcycle(Vehicle):
  23. def __init__(self, license_plate):
  24. super(Motorcycle, self).__init__(VehicleSize.MOTORCYCLE, license_plate, spot_size=1)
  25. def can_fit_in_spot(self, spot):
  26. return True
  27. class Car(Vehicle):
  28. def __init__(self, license_plate):
  29. super(Car, self).__init__(VehicleSize.COMPACT, license_plate, spot_size=1)
  30. def can_fit_in_spot(self, spot):
  31. return spot.size in (VehicleSize.LARGE, VehicleSize.COMPACT)
  32. class Bus(Vehicle):
  33. def __init__(self, license_plate):
  34. super(Bus, self).__init__(VehicleSize.LARGE, license_plate, spot_size=5)
  35. def can_fit_in_spot(self, spot):
  36. return spot.size == VehicleSize.LARGE
  37. class ParkingLot(object):
  38. def __init__(self, num_levels):
  39. self.num_levels = num_levels
  40. self.levels = [] # List of Levels
  41. def park_vehicle(self, vehicle):
  42. for level in self.levels:
  43. if level.park_vehicle(vehicle):
  44. return True
  45. return False
  46. class Level(object):
  47. SPOTS_PER_ROW = 10
  48. def __init__(self, floor, total_spots):
  49. self.floor = floor
  50. self.num_spots = total_spots
  51. self.available_spots = 0
  52. self.spots = [] # List of ParkingSpots
  53. def spot_freed(self):
  54. self.available_spots += 1
  55. def park_vehicle(self, vehicle):
  56. spot = self._find_available_spot(vehicle)
  57. if spot is None:
  58. return None
  59. else:
  60. spot.park_vehicle(vehicle)
  61. return spot
  62. def _find_available_spot(self, vehicle):
  63. """Find an available spot where vehicle can fit, or return None"""
  64. pass
  65. def _park_starting_at_spot(self, spot, vehicle):
  66. """Occupy starting at spot.spot_number to vehicle.spot_size."""
  67. pass
  68. class ParkingSpot(object):
  69. def __init__(self, level, row, spot_number, spot_size, vehicle_size):
  70. self.level = level
  71. self.row = row
  72. self.spot_number = spot_number
  73. self.spot_size = spot_size
  74. self.vehicle_size = vehicle_size
  75. self.vehicle = None
  76. def is_available(self):
  77. return True if self.vehicle is None else False
  78. def can_fit_vehicle(self, vehicle):
  79. if self.vehicle is not None:
  80. return False
  81. return vehicle.can_fit_in_spot(self)
  82. def park_vehicle(self, vehicle):
  83. pass
  84. def remove_vehicle(self):
  85. pass