Programmation Orientée Objet en Python
  • Back to Main Website
  • Home
  • Introduction: Histoire et Concepts
    • Introduction: Histoire et Concepts
    • Histoire de la programmation
    • Première Structuration des données
    • Naissance de la POO
    • Python: tout n’est qu’objet
    • Python : Simplicité des objets et performance sous-jacente
    • Classes en Python : Concepts fondamentaux

    • Travaux Pratiques
    • Construire sa propre Liste
    • Construire son propre DataFrame
  • Encapsulation, Héritage, Composition et Dunder
    • Encapsulation, Heritage, Composition et Dunder
    • Encapsulation en Python
    • Héritage en Python : Concept et intérêt
    • Héritage vs Composition
    • Méthodes Dunder en Python
    • Python call Method: A Fun Exploration

    • Travaux Pratiques
    • TP: Heritage avec le pricing d’option
    • TP : Ajouter des méthodes dunder à DataFrameSimple
    • TP : Étendre la classe Liste avec des méthodes dunder
    • TP: Dunder Method with Tensor for Automatic Differentiation
  • Polymorphisme et Surcharge
    • Polymorphisme et Surcharge
    • Polymorphism in Object-Oriented Programming
    • Polymorphism in Python: Function Overloading and Type Checking
    • Class Creation: Standard vs type()
    • Type Hinting, Typing Module, and Linters in Python
    • Abstract Classes
    • Protocol Classes

    • Travaux Pratiques
    • TP
  • Decorators
    • Design Patterns
    • The decorator pattern
    • Decorator Practically
    • Built-in Decorators and Standard Library Decorators in Python
    • Practical Decorators in Python Libraries

    • Travaux Pratiques
    • TP: Monte Carlo Option Pricing with Decorators
    • TP: Optimizing Heston Model Monte Carlo Simulation
  • Project Management and Packaging
    • Project and Package
    • Organizing Python Projects
    • Understanding imports
    • Python Package Management and Virtual Environments
    • Unit Testing in Python

    • Travaux Pratiques
    • TP: Creating a Linear Regression Package
  • Design Patterns
    • OOP Design Patterns
    • Python-Specific Design Patterns
    • Creation Design Patterns
    • Structural Design Patterns
    • Behavioral Design Pattern

    • Travaux Pratiques
    • TP
  • Sujets de Projets possibles
    • Projets
    • Projets POO - 2024-2025
  • Code source
  1. Héritage vs Composition
  • Encapsulation, Heritage, Composition et Dunder
  • Encapsulation en Python
  • Héritage en Python : Concept et intérêt
  • Héritage vs Composition
  • Méthodes Dunder en Python
  • Python call Method: A Fun Exploration
  • Travaux Pratiques
    • TP: Heritage avec le pricing d’option
    • TP : Ajouter des méthodes dunder à DataFrameSimple
    • TP : Étendre la classe Liste avec des méthodes dunder
    • TP: Dunder Method with Tensor for Automatic Differentiation

On this page

  • Héritage vs Composition
    • Définitions
    • Comparaison
    • Avantages et inconvénients
    • Quand utiliser l’un ou l’autre ?
    • Principe de conception : “Favoriser la composition sur l’héritage”
    • Exemple combinant héritage et composition

Héritage vs Composition

Cours
Fondamentaux
Découvrez les différences entre l’héritage et la composition en programmation orientée objet, leurs avantages et inconvénients, et comment choisir la meilleure approche pour concevoir des classes flexibles et extensibles.
Author

Remi Genet

Published

2024-10-21

Héritage vs Composition


Définitions

  1. Héritage : Une relation “est-un” où une classe dérive d’une autre, héritant de ses attributs et méthodes.

  2. Composition : Une relation “a-un” où une classe contient une instance d’une autre classe comme attribut.

Comparaison

Héritage

Composition

Avantages et inconvénients

Héritage

Avantages : - Permet une réutilisation directe du code - Représente bien les relations hiérarchiques naturelles - Facilite le polymorphisme

Inconvénients : - Peut créer un couplage fort entre les classes - Peut devenir complexe avec l’héritage multiple - Peut violer le principe de substitution de Liskov si mal utilisé

Composition

Avantages : - Offre une plus grande flexibilité - Permet une meilleure encapsulation - Facilite les changements de comportement à l’exécution

Inconvénients : - Peut nécessiter plus de code initial - Peut être moins intuitif pour représenter certaines relations

Quand utiliser l’un ou l’autre ?

  1. Utilisez l’héritage quand :

    • Il existe une relation “est-un” claire et logique
    • Vous voulez réutiliser le code dans plusieurs classes dérivées
    • Le comportement de la classe de base ne change pas souvent

    Exemple : Chien est un Animal, Carré est une Forme

  2. Utilisez la composition quand :

    • Il existe une relation “a-un” ou “utilise-un”
    • Vous voulez une plus grande flexibilité pour changer les comportements
    • Vous voulez éviter les problèmes liés à l’héritage multiple

    Exemple : Voiture a un Moteur, Ordinateur a une CPU

Principe de conception : “Favoriser la composition sur l’héritage”

Ce principe suggère d’utiliser la composition comme première approche, car elle offre généralement plus de flexibilité et un couplage plus faible. L’héritage devrait être utilisé judicieusement, lorsqu’il représente vraiment une relation “est-un”.

Exemple combinant héritage et composition

Dans cet exemple : - Epee hérite de Arme (relation “est-un”) - Guerrier hérite de Personnage (relation “est-un”) - Personnage utilise la composition avec Arme (relation “a-un”)

Cette approche combine les avantages de l’héritage et de la composition, permettant une structure flexible et extensible.

Back to top
Héritage en Python : Concept et intérêt
Méthodes Dunder en Python

Programmation Orienté Object en Python, Rémi Genet.
Licence
Code source disponible sur Github

 

Site construit avec et Quarto
Inspiration pour la mise en forme du site ici
Code source disponible sur GitHub