parking_lot.py 3.0 KB

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