Avancé
🧠 Fondamentaux
30 XP
0 personnes ont réussi
Classe Protocol (duck typing formel)
Le duck typing, c'est le principe de Python : si ca marche comme un canard et que ca fait coin-coin, c'est un canard. Autrement dit, on ne vérifie pas le type d'un objet, on vérifie s'il a les bonnes méthodes.
Depuis Python 3.8, le module typing propose Protocol pour formaliser ca. Un Protocol definit une interface : quelles méthodes un objet doit avoir. Mais contrairement a l'héritage classique, les classes n'ont pas besoin d'heriter du Protocol. Il suffit qu'elles aient les bonnes méthodes.
Exemple : from typing import Protocol
class Parleur(Protocol): def parler(self) -> str: ...
class Chien: # pas d'héritage de Parleur ! def parler(self) -> str: return 'Woof'
# Chien est considere compatible avec Parleur
Definis un Protocol nomme Dessinable qui exige une méthode dessiner(self) -> str.
Crée deux classes Cercle(rayon) et Carre(cote) qui implementent dessiner sans heriter du protocole. Cercle.dessiner() retourne 'Cercle r=5' (avec le rayon), Carre.dessiner() retourne 'Carre c=3' (avec le cote).
Écris une fonction afficher_tout(formes) qui appelle dessiner() sur chaque forme et retourne la liste des résultats.
Exemple : formes = [Cercle(5), Carre(3)] afficher_tout(formes) # ['Cercle r=5', 'Carre c=3']
Tests (2/4)
Cercle
assert Cercle(5).dessiner() == 'Cercle r=5'
Carre
assert Carre(3).dessiner() == 'Carre c=3'
+ 0 tests cachés
Indices (3 disponibles)
Solution officielle
from typing import Protocol, List
class Dessinable(Protocol):
def dessiner(self) -> str:
...
class Cercle:
def __init__(self, rayon):
self.rayon = rayon
def dessiner(self) -> str:
return f'Cercle r={self.rayon}'
class Carre:
def __init__(self, cote):
self.cote = cote
def dessiner(self) -> str:
return f'Carre c={self.cote}'
def afficher_tout(formes):
return [f.dessiner() for f in formes]