Avancé
🧠 Fondamentaux
30 XP
0 personnes ont réussi
E-commerce #10 : Catalogue avec __iter__
Un catalogue iterable permet d'utiliser la syntaxe for produit in catalogue directement. Pour ca, il faut implémenter les méthodes speciales __iter__, __len__ et __contains__.
__iter__ retourne un iterateur. Le plus simple est de deleguer a la liste interne avec iter(self.produits).
__contains__ est appele quand tu ecris 'x in catalogue'. Sans cette méthode, Python utiliserait __iter__ pour chercher, mais c'est moins efficace.
Crée une classe Catalogue avec : - __init__ : self.produits = [] - ajouter(produit) : ajoute au catalogue - __iter__ : permet for p in catalogue - __len__ : retourne le nombre de produits - __contains__ : vérifie par nom si un produit est dans le catalogue - filtrer(disponible=True) : retourne les produits filtres par disponibilite
Exemple : cat = Catalogue() cat.ajouter(Produit('Livre', 10.0, 5)) for p in cat: print(p.nom) # 'Livre' len(cat) # 1
Tests (2/4)
Iteration
from decimal import Decimal
c = Catalogue()
c.ajouter(Produit('A', Decimal('10'), 5))
noms = [p.nom for p in c]
assert noms == ['A']
__len__
from decimal import Decimal
c = Catalogue()
c.ajouter(Produit('A', Decimal('10'), 5))
c.ajouter(Produit('B', Decimal('5'), 0))
assert len(c) == 2
+ 0 tests cachés
Indices (3 disponibles)
Solution officielle
from decimal import Decimal
class Produit:
def __init__(self, nom, prix, stock):
self.nom = nom
self.prix = Decimal(str(prix))
self.stock = stock
def est_disponible(self): return self.stock > 0
class Catalogue:
def __init__(self):
self.produits = []
def ajouter(self, produit):
self.produits.append(produit)
def __iter__(self):
return iter(self.produits)
def __len__(self):
return len(self.produits)
def __contains__(self, produit):
return any(p.nom == produit.nom for p in self.produits)
def filtrer(self, disponible=True):
return [p for p in self.produits if p.est_disponible() == disponible]