Créer une classe Voiture. Un objet de la classe Voiture doit être caractérisé par : son immatriculation, sa marque, son propriétaire (par défaut il sera 'inconnu') et son abonnement, qui est un booléen qui vaut True s'il existe un abonnement pour cette voiture et False sinon (par défaut False).
Créer une méthode spéciale permettant d'afficher les caractéristiques d'une voiture sous la forme : AB-123-BA - Citroën - S. LOEB - True
Créer les méthodes obtenir_immatriculation, obtenir_marque, obtenir_proprietaire, est_abonne et prend_abonnement qui permettent respectivement de retourner l'immatriculation, la marque, le nom du propriétaire, de savoir si la voiture a un abonnement, et de prendre un abonnement.
fin_abonnement dans la classe Voiture : c'est le parking, et non la voiture elle-même, qui doit gérer la fin d'un abonnement (voir la partie 2).Un parking a 5 étages (de 0 à 4), chacun comprenant 80 places (de 0 à 79). Une place est repérée par un numéro construit ainsi : le chiffre des centaines correspond au numéro d'étage, et les deux chiffres suivants (dizaines et unités) correspondent au numéro de la place dans l'étage, c'est-à-dire numero = etage * 100 + place.
Par exemple, la place n°215 correspond à la place 15 de l'étage 2 (215 = 2×100 + 15) ; la place n°17 correspond à la place 17 de l'étage 0 (17 = 0×100 + 17, le chiffre des centaines étant simplement absent puisqu'il vaut 0).
Créer la classe Parking avec les attributs d'instance occupation et abonnements, formés chacun de 5 listes de 80 zéros, qui représentent les places (toutes libres lors de l'instanciation) du parking.
Créer la méthode place_dans_niveau qui retourne le n° du niveau et le n° de la place dans le niveau quand on lui passe en paramètre le n° d'une place. Par exemple pour la place n°215, elle doit retourner 2, 15 ; pour la place n°9, elle doit retourner 0, 9.
Créer la méthode affecter_voiture qui permet de placer une voiture (de la classe Voiture) à un numéro de place (on pourra utiliser la méthode précédente). Le 0 représentant une place libre de la liste self.occupation sera alors remplacé par la voiture qui occupe la place.
Créer la méthode abonnement qui permet de "bloquer" une place pour un abonné. On placera la voiture abonnée à la place du 0 qui correspond au numéro de place bloquée dans la liste self.abonnements.
Créer une méthode spéciale qui représente le parking et les places occupées, par une voiture et par les abonnements (une place libre sera représentée par un "-", une place occupée par un caractère '*', soit par une voiture soit réservée à un abonné).
Créer une méthode est_occupee qui prend en paramètre un n° de place et qui retourne l'objet voiture s'il y a une voiture et 0 sinon.
Créer la méthode occupation_illegale qui retourne la liste des places occupées illégalement (voitures non abonnées sur les places de voitures abonnées).
Créer la méthode places_libres qui retourne la liste des numéros de places libres (c'est-à-dire ni occupées par une voiture ni réservées à un abonné).
Créer la méthode fin_abonnement qui prend en paramètre un numéro de place et qui "libère" une place réservée à un abonné. Cette méthode doit avoir deux effets, puisque c'est bien le parking (et non le client) qui met fin à l'abonnement :
self.abonnements (la place n'est plus réservée) ;abonnement à False (sa voiture n'est plus abonnée non plus).