Programmation Orientée Objet
Définition
La Programmation Orientée Objet (POO) est un paradigme de programmation qui permet de structurer le code en regroupant les données et les comportements dans des objets. Cette approche facilite la réutilisation du code, sa maintenance et sa compréhension.
Tip
La POO est particulièrement adaptée pour modéliser des systèmes complexes où les données et les comportements sont étroitement liés.
Classes et Objets
Une classe est un modèle qui définit : - Les attributs (données) - Les méthodes (comportements)
Un objet est une instance d'une classe, c'est-à-dire une réalisation concrète du modèle défini par la classe.
Danger
En Python, la méthode __init__
est le constructeur de la classe. Elle est appelée automatiquement lors de la création d'un objet.
Exemple de création d'une classe et d'un objet :
class Voiture:
def __init__(self, marque, modele):
self.marque = marque
self.modele = modele
self.vitesse = 0
def accelerer(self, delta):
self.vitesse += delta
# Création d'un objet
ma_voiture = Voiture("Renault", "Clio")
ma_voiture.accelerer(50)
# Accès aux attributs
print(f"Ma {ma_voiture.marque} {ma_voiture.modele} roule à {ma_voiture.vitesse} km/h")
Encapsulation
L'encapsulation est un concept fondamental de la POO qui permet de : - Regrouper les données (attributs) et les méthodes qui les manipulent - Contrôler l'accès aux données - Protéger les données de modifications non autorisées
Danger
En Python, il existe différentes conventions pour contrôler l'accès aux attributs :
- Sans préfixe (public) : accessible partout
- _attribut
: protégé (ne pas utiliser hors de la classe)
- __attribut
: privé (accès impossible hors de la classe)
Tip
Il est recommandé d'utiliser des getters et setters pour accéder aux attributs privés d'une classe.
class CompteBancaire:
def __init__(self, solde_initial):
self.__solde = solde_initial
self.__operations = []
def deposer(self, montant):
if montant > 0:
self.__solde += montant
self.__operations.append(("dépôt", montant))
return True
return False
def retirer(self, montant):
if montant > 0 and self.__solde >= montant:
self.__solde -= montant
self.__operations.append(("retrait", montant))
return True
return False
def get_solde(self):
return self.__solde
def get_operations(self):
return self.__operations.copy()
# Exemple d'utilisation
compte = CompteBancaire(1000)
compte.deposer(500) # True
compte.retirer(200) # True
print(f"Solde actuel : {compte.get_solde()} €") # 1300 €
print("Opérations :", compte.get_operations())
Héritage
L'héritage est un mécanisme qui permet de créer une nouvelle classe à partir d'une classe existante : - La nouvelle classe (classe fille) hérite des attributs et méthodes de la classe parent - On peut ajouter de nouveaux attributs et méthodes - On peut modifier (redéfinir) les comportements existants
Tip
L'héritage permet de créer une hiérarchie de classes et de réutiliser du code existant.
Danger
En Python, toutes les méthodes sont virtuelles, c'est-à-dire qu'elles peuvent être redéfinies dans les classes filles.
class Animal:
def __init__(self, nom, age):
self.nom = nom
self.age = age
def faire_bruit(self):
pass
def description(self):
return f"{self.nom} ({self.age} ans)"
class Chat(Animal):
def __init__(self, nom, age, couleur):
super().__init__(nom, age) # Appel du constructeur parent
self.couleur = couleur
def faire_bruit(self):
return "Miaou!"
def description(self):
return f"Chat {self.couleur} : {super().description()}"
class Chien(Animal):
def __init__(self, nom, age, race):
super().__init__(nom, age)
self.race = race
def faire_bruit(self):
return "Wouf!"
def description(self):
return f"Chien {self.race} : {super().description()}"
# Exemple d'utilisation
chat = Chat("Felix", 3, "noir")
chien = Chien("Rex", 5, "Berger Allemand")
print(chat.description()) # Chat noir : Felix (3 ans)
print(chien.description()) # Chien Berger Allemand : Rex (5 ans)
Polymorphisme
Le polymorphisme permet d'utiliser des objets de classes différentes de manière uniforme : - Même interface (mêmes noms de méthodes) - Comportements différents
animaux = [Chat("Felix"), Chien("Rex")]
for animal in animaux:
print(animal.faire_bruit()) # Appelle la bonne méthode selon la classe
Exercices
Exercice 1 : Création d'une classe
Créer une classe Rectangle
avec :
- Attributs : longueur, largeur
- Méthodes : calcul_perimetre(), calcul_aire()
Exercice 2 : Héritage
Créer une classe Carre
qui hérite de Rectangle
Exercice 3 : Encapsulation
Modifier la classe CompteBancaire
pour :
- Empêcher les retraits qui mettraient le compte à découvert
- Ajouter des frais de gestion mensuels
Exercice 4 : Polymorphisme
Créer une hiérarchie de classes pour différentes formes géométriques avec une méthode commune calcul_aire()