objectif
Définir un contrat d’interface et l’utiliser sans héritage explicite.
code minimal
from typing import Protocol
class HasArea(Protocol):
def area(self) -> float: ...
class Square:
def __init__(self, s: float): self.s = s
def area(self) -> float: return self.s * self.s
class Circle:
def __init__(self, r: float): self.r = r
def area(self) -> float: return 3.14159 * self.r * self.r
def total_area(shapes: list[HasArea]) -> float:
return sum(s.area() for s in shapes)
print(int(total_area([Square(2), Circle(1)]) * 100) == (4 + 3.14159) * 100 // 1)
utilisation
print(True)
variante(s) utile(s)
from typing import Protocol, runtime_checkable
@runtime_checkable
class P(Protocol):
def ping(self) -> str: ...
class X:
def ping(self) -> str: return "pong"
print(isinstance(X(), P))
notes
- Protocol décrit une interface attendue (duck typing).
- Utile avec mypy/pyright pour détecter tôt les écarts.