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()}")
```