Le polymorphisme est un concept clé de la programmation orientée objet qui permet à des objets de différentes classes d’être traités de manière uniforme. En Python 3, le polymorphisme peut être mis en œuvre à travers plusieurs mécanismes, notamment les méthodes spéciales, l’héritage et l’interface.
- Méthodes spéciales:
Les méthodes spéciales en Python permettent de définir le comportement des opérateurs intégrés et des fonctions prédéfinies. En redéfinissant certaines de ces méthodes dans vos classes, vous pouvez obtenir un comportement polymorphe. Par exemple, en définissant la méthode spéciale__add__
dans vos classes, vous pouvez permettre l’addition entre des objets de ces classes.
pythonclass Animal:
def make_sound(self):
pass
class Dog(Animal):
def make_sound(self):
return "Woof!"
class Cat(Animal):
def make_sound(self):
return "Meow!"
def animal_sounds(animals):
for animal in animals:
print(animal.make_sound())
dog = Dog()
cat = Cat()
animal_sounds([dog, cat]) # Produira "Woof!" et "Meow!"
- Héritage:
L’héritage est un autre mécanisme clé pour implémenter le polymorphisme en Python. En héritant d’une classe de base et en redéfinissant ses méthodes dans les sous-classes, vous pouvez obtenir un comportement polymorphe. Par exemple, vous pouvez avoir une classeShape
avec une méthodearea
, et des sous-classes telles queCircle
etRectangle
qui redéfinissent la méthodearea
selon leur forme spécifique.
pythonclass Shape:
def area(self):
pass
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius ** 2
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
shapes = [Circle(5), Rectangle(3, 4)]
for shape in shapes:
print("Area:", shape.area())
- Interface:
Bien que Python ne dispose pas d’un mécanisme d’interface intégré comme dans certains autres langages orientés objet, vous pouvez toujours utiliser l’approche duck typing pour atteindre un polymorphisme basé sur l’interface. Cela signifie que vous pouvez traiter des objets de différentes classes de manière polymorphe tant qu’ils supportent les mêmes méthodes. Par exemple, vous pourriez avoir différentes classes avec des méthodesmove
etdraw
, et tant qu’elles fournissent ces méthodes, vous pouvez les traiter de manière uniforme.
pythonclass Drawable:
def draw(self):
pass
class Movable:
def move(self):
pass
class Circle(Drawable, Movable):
def draw(self):
print("Drawing Circle")
def move(self):
print("Moving Circle")
class Square(Drawable, Movable):
def draw(self):
print("Drawing Square")
def move(self):
print("Moving Square")
def draw_and_move(objects):
for obj in objects:
obj.draw()
obj.move()
objects = [Circle(), Square()]
draw_and_move(objects)
En utilisant ces mécanismes, vous pouvez mettre en œuvre le polymorphisme en Python de manière efficace et élégante, permettant ainsi à votre code de traiter des objets de différentes classes de manière uniforme.

Plus de connaissances
Bien sûr, explorons davantage le concept de polymorphisme en Python en examinant chacun de ses mécanismes plus en détail.
-
Méthodes spéciales:
Les méthodes spéciales, également connues sous le nom de méthodes magiques, sont des méthodes prédéfinies en Python avec des noms spéciaux entourés de doubles underscores (underscores doubles). Elles sont utilisées pour définir le comportement des objets dans différentes situations, telles que l’addition, la soustraction, la comparaison, etc. En redéfinissant ces méthodes dans vos propres classes, vous pouvez personnaliser le comportement de vos objets et obtenir un polymorphisme.Voici quelques exemples de méthodes spéciales couramment utilisées pour implémenter le polymorphisme en Python :
__init__
: Constructeur de classe pour initialiser les nouveaux objets.__str__
: Retourne une représentation sous forme de chaîne de l’objet.__add__
,__sub__
,__mul__
,__div__
: Définissent le comportement des opérateurs arithmétiques.__eq__
,__lt__
,__gt__
: Définissent le comportement des opérateurs de comparaison.
-
Héritage:
L’héritage est un concept fondamental de la programmation orientée objet qui permet à une classe de hériter des attributs et des méthodes d’une classe parente, également appelée classe de base. En héritant d’une classe de base, une classe enfant peut étendre ou modifier le comportement de la classe de base, ce qui permet d’implémenter le polymorphisme. Les classes enfant peuvent redéfinir les méthodes de la classe de base pour fournir une implémentation spécifique à leur contexte tout en conservant une interface commune.Voici quelques points clés sur l’héritage en Python :
- Utilisez le mot-clé
class
suivi du nom de la classe enfant et du nom de la classe de base entre parenthèses. - Les classes peuvent hériter de plusieurs classes en même temps, ce qui est connu sous le nom d’héritage multiple.
- La méthode
super()
est utilisée pour appeler les méthodes de la classe parente à partir de la classe enfant.
- Utilisez le mot-clé
-
Interface:
Bien que Python ne supporte pas les interfaces de manière native comme certains autres langages orientés objet tels que Java, le polymorphisme basé sur l’interface peut être réalisé grâce à l’approche duck typing. Duck typing est un principe de programmation qui se concentre sur le comportement plutôt que sur le type des objets. Tant qu’un objet supporte les méthodes et les attributs requis, il peut être traité de manière polymorphe.Voici comment le duck typing fonctionne en Python :
- Au lieu de vérifier le type d’un objet, vérifiez simplement si l’objet a les méthodes ou les attributs nécessaires.
- Si un objet peut être utilisé comme un canard (duck) et qu’il fait « quack » comme un canard et qu’il marche comme un canard, alors il peut être traité comme un canard.
En combinant ces mécanismes, vous pouvez créer des hiérarchies de classes complexes tout en conservant une flexibilité et une extensibilité maximales, ce qui est essentiel dans le développement logiciel moderne. Le polymorphisme en Python permet une gestion efficace et élégante des objets de différentes classes, ce qui facilite la création de code modulaire et réutilisable.