Facebook
From Abrupt Lemur, 5 Years ago, written in Python.
Embed
Download Paste or View Raw
Hits: 188
  1. class _IgnitionSystem(object):
  2.    
  3.    @staticmethod
  4.    def produce_spark():
  5.       return True
  6.  
  7. class _Engine(object):
  8.  
  9.    def __init__(self):
  10.       self.revs_per_minute = 0
  11.  
  12.    def turnon(self):
  13.       self.revs_per_minute = 2000
  14.    
  15.    def turnoff(self):
  16.       self.revs_per_minute = 0
  17.  
  18. class _FuelTank(object):
  19.    
  20.    def __init__(self, level=30):
  21.       self._level = level
  22.    
  23.    @property
  24.    def level(self):
  25.       return self._level
  26.    
  27.    @level.setter
  28.         def level(self, level):
  29.       self._level = level
  30.  
  31. class _DashBoardLight(object):
  32.  
  33.    def __init__(self, is_on=False):
  34.       self._is_on = is_on
  35.  
  36.    def __str__(self):
  37.       return self.__class__.__name__
  38.  
  39.    @property
  40.    def is_on(self):
  41.       return self._is_on
  42.    
  43.    @is_on.setter
  44.    def is_on(self, status):
  45.       self._is_on = status
  46.    
  47.    def status_check(self):
  48.       if self._is_on:
  49.          print("{}: ON".format(str(self)))
  50.       else:
  51.          print("{}: OFF".format(str(self)))
  52.  
  53. class _HandBrakeLight(_DashBoardLight):
  54.    pass
  55.  
  56. class _FogLampLight(_DashBoardLight):
  57.    pass
  58.  
  59. class _Dashboard(object):
  60.    
  61.    def __init__(self):
  62.       self.lights = {"handbreak": _HandBrakeLight(), "fog": _FogLampLight()}
  63.    
  64.    def show(self):
  65.            for light in self.lights.values():
  66.       light.status_check()
  67.  
  68. # Facade
  69. class Car(object):
  70.    
  71.    def __init__(self):
  72.       self.ignition_system = _IgnitionSystem()
  73.       self.engine = _Engine()
  74.       self.fuel_tank = _FuelTank()
  75.       self.dashboard = _Dashboard()
  76.    
  77.    @property
  78.    def km_per_litre(self):
  79.       return 17.0
  80.    
  81.    def consume_fuel(self, km):
  82.       litres = min(self.fuel_tank.level, km / self.km_per_litre)
  83.       self.fuel_tank.level -= litres
  84.    
  85.    def start(self):
  86.       print("\nStarting...")
  87.       self.dashboard.show()
  88.       if self.ignition_system.produce_spark():
  89.          self.engine.turnon()
  90.       else:
  91.          print("Can't start. Faulty ignition system")
  92.    
  93.    def has_enough_fuel(self, km, km_per_litre):
  94.       litres_needed = km / km_per_litre
  95.       if self.fuel_tank.level > litres_needed:
  96.          return True
  97.       else:
  98.          return False
  99.            
  100.       def drive(self, km = 100):
  101.          print("\n")
  102.          if self.engine.revs_per_minute > 0:
  103.             while self.has_enough_fuel(km, self.km_per_litre):
  104.                self.consume_fuel(km)
  105.                print("Drove {}km".format(km))
  106.                print("{:.2f}l of fuel still left".format(self.fuel_tank.level))
  107.          else:
  108.             print("Can't drive. The Engine is turned off!")
  109.          
  110.          def park(self):
  111.             print("\nParking...")
  112.             self.dashboard.lights["handbreak"].is_on = True
  113.             self.dashboard.show()
  114.             self.engine.turnoff()
  115.          
  116.          def switch_fog_lights(self, status):
  117.             print("\nSwitching {} fog lights...".format(status))
  118.             boolean = True if status == "ON" else False
  119.             self.dashboard.lights["fog"].is_on = boolean
  120.             self.dashboard.show()
  121.          
  122.          def fill_up_tank(self):
  123.             print("\nFuel tank filled up!")
  124.             self.fuel_tank.level = 100
  125.                                
  126. # the main function is the Client
  127. def main():
  128.    car = Car()
  129.    car.start()
  130.    car.drive()
  131.    car.switch_fog_lights("ON")
  132.    car.switch_fog_lights("OFF")
  133.         car.park()
  134.    car.fill_up_tank()
  135.    car.drive()
  136.    car.start()
  137.    car.drive()
  138.  
  139. if __name__ == "__main__":
  140.    main()