= Atelier sur la première partie L'atelier suivant vous fait construire une structure où vous pouvez : - créer des bibliothèques - créer des livres - créer des utilisateurs Et avec ces objets, vous pouvez : - ajouter des livres à vos bibliothèques - emprunter et rendre des livres - voir les informations sur les emprunts - voir les informations sur les livres présents dans une bibliothèque - etc. L'exercice, qui peut vous prendre un peu de temps, vous permet de : - manipuler des objets, listes, dictionnaires - utiliser des f-strings pour afficher des informations en console - utiliser des méthodes et même découvrir la méthode `_ _ str _ _` (faites une recherche Google) - structurer un peu votre code (concept limité par la taille de l'exercice) == Organisation - un package `entities` contenant * un module `library` pour y mettre la classe `Library` * un module `book` pour y mettre la classe `Book` * un module `user` pour y mettre la classe `User` - un module `application` vous servant de point d'entrée l'organisation est simple, ceci dû à la taille du projet. Des projets grandissants impliquent souvent des réorganisations. == Des bibliothèques . Créez une classe `Library` . Avec des attributs - `name` (`None`) - `is_open` (`True`) - `books` (`None`) . Avec des méthodes . `_ _ init _ _(self, name=None, is_open=True)` qui initialise les attributs du nouvel objet. . `open(self, value=True)` pour changer l'état d'ouverture : - Ne fait rien si `value` a déjà la même valeur que `self.is_open` . `register_book(self, book)` qui ajoute un livre à l'attribut `.books` (le transforme d'abord en liste s'il est à `None`, puis ajoute le livre) . `show_books()` qui affiche la liste des livres enregistrés . `_ _ str _ _(self)` qui renvoie le texte affiché si on fait `print()` sur l'objet . `get_book_avg_prices()` qui renvoie le prix moyen des livres de la bibliothèque == Des livres . Créez une classe `Book` . Avec des attributs - `title` (`None`) - `author` (`None`) - `is_borrowed` (`False`) : le livre est-il emprunté - `borrower` (`None`) : personne qui a emprunté - `history` (`None`) : liste des opérations d'emprunt du livre - `price` (`0`) : prix de base . Avec des méthodes . `_ _ init _ _(self, ...)` pour initialiser les attributs `title`, `price` et `author` . `borrow(self, user)` qui marque le livre comme emprunté, et modifie `borrower` : - Ne fait rien si le livre est déjà marqué emprunté, sinon : - `is_borrowed` devient `True` - `borrower` prend la référence de l'objet de la classe `User` - `history` *devient* une liste à laquelle on ajoute le dictionnaire `{"user": user, "when": datetime.now()}` . `return_borrow(self)` qui marque le livre comme rendu (non emprunté) - Ne fait rien si le livre est déjà marqué comme non emprunté, sinon : - `borrower` prend la valeur `None` . `show_history(self)` qui affiche l'historique formaté des emprunts . `show_status(self)` qui affiche le statut du livre : titre, emprunté etc. == Des utilisateurs . Créez une classe `User` . Avec des attributs - `name` (`None`) . Avec des méthodes . `_ _ init _ _(self, name=None)` qui initialise l'attribut de l'objet . `_ _ str _ _ (self)` qui renvoie une chaîne `f"Utilisateur : {self.name}"`