---
# System prepended metadata

title: Exercices Classes

---

Exos python classes



### Exercice : Système de gestion de bibliothèque avec décorateurs personnalisés

Créez un système de gestion de bibliothèque avec les classes suivantes :

1. **Item (Classe Abstraite)** : Représente un élément général de la bibliothèque.
   - Attributs : `title`, `author`, `publication_year`
   - Méthodes : `__init__`, `__str__`, `is_available` (méthode abstraite)
   - Utilisez un décorateur personnalisé pour mesurer le temps d'exécution de `is_available`.

2. **Book (Sous-classe de Item)** : Représente un livre.
   - Attributs : `title`, `author`, `publication_year`, `isbn`, `num_copies`
   - Méthodes : `__init__`, `__str__`, `is_available`, `borrow`, `return_book`
   - Utilisez un décorateur de classe personnalisé pour ajouter un compteur d'instances.

3. **Magazine (Sous-classe de Item)** : Représente un magazine.
   - Attributs : `title`, `author`, `publication_year`, `issue_number`, `num_copies`
   - Méthodes : `__init__`, `__str__`, `is_available`, `borrow`, `return_magazine`
   - Utilisez un décorateur de méthode personnalisé pour loguer les emprunts et retours.

4. **Library** : Gère une collection d'éléments.
   - Attributs : `collection` (un dictionnaire avec le titre comme clé et l'objet Item comme valeur)
   - Méthodes : `__init__`, `add_item`, `remove_item`, `search_item`, `borrow_item`, `return_item`


```python
# Exemple d'utilisation
library = Library()
book = Book("Électrothérapie", "Maloine", 1969, "1234567890", 5)
magazine = Magazine("Ma Campagne", "Touriste", 2023, "Mai", 10)

library.add_item(book)
library.add_item(magazine)

print(library.search_item("1984"))
print(library.search_item("Time"))

library.borrow_item("1984")
print(library.search_item("1984"))

library.return_item("1984", "book")
print(library.search_item("1984"))

print(f"Total Book instances: {Book.get_instance_count()}")
print(f"Total Magazine instances: {Magazine.get_instance_count()}")
```
