- Évolution vers l'Encapsulation
Avant d'utiliser les classes, il est courant de simuler le regroupement de données et de comportements à l'aide de dictionnaires et de fermetures (closures). Cette approche permet de structurer le code, mais montre rapidement ses limites en matière d'abstraction.
# Système de combat : Héros vs Monstre
def creer_heros(nom, pv, degats, role):
heros = {
'nom': nom,
'pv': pv,
'degats': degats,
'role': role
}
def attaquer(cible):
cible['pv'] -= heros['degats']
print(f"{cible['nom']} subit une attaque de {heros['nom']}, perdant {heros['degats']} PV.")
heros['attaquer'] = attaquer
return heros
def creer_monstre(nom, pv, degats, espece):
monstre = {
'nom': nom,
'pv': pv,
'degats': degats,
'espece': espece
}
def mordre(cible):
cible['pv'] -= monstre['degats']
print(f"{cible['nom']} est mordu par {monstre['nom']}, perdant {monstre['degats']} PV.")
monstre['mordre'] = mordre
return monstre
# Instanciation simulée
dragon = creer_monstre('Dragon', 500, 50, 'Reptile')
chevalier = creer_heros('Arthur', 150, 20, 'Guerrier')
chevalier['attaquer'](dragon)
dragon['mordre'](chevalier)
Bien que cette méthode regroupe les attributs et les méthodes, elle ne fournit pas de véritable abstraction de type. C'est ici qu'intervient la programmation orientée objet (POO) avec les classes.
- Les Classes et Objets en Python
En Python, le mot-clé class permet de définir un modèle (la classe) à partir duquel des objets concrets (les instances) sont créés.
class Vehicule:
# Attribut de classe (partagé par toutes les instances)
pays_origine = 'Allemagne'
def __init__(self, marque, vitesse_max, carburant):
# Attributs d'instance (spécifiques à chaque objet)
self.marque = marque
self.vitesse_max = vitesse_max
self.carburant = carburant
def accelerer(self, increment):
print(f"La {self.marque} accélère. Vitesse augmentée de {increment} km/h.")
# Interaction avec la classe
print(Vehicule.pays_origine)
print(Vehicule.__dict__)
# Instanciation
voiture1 = Vehicule('BMW', 250, 'Essence')
print(voiture1.__dict__)
print(voiture1.marque)
# Appel de méthode
voiture1.accelerer(50)
# Modification via __dict__
voiture1.__dict__['marque'] = 'Audi'
print(voiture1.__dict__['marque'])
# Ajout dynamique d'attribut
voiture1.annee = 2023
print(voiture1.__dict__)
Lors de l'instanciation, la méthode __init__ est appelée automatiquement. Le paramètre self représente l'instance elle-même, permettant de lier les attributs à l'objet. L'attribut spécial __dict__ stocke tous les attributs modifiables de l'instance sous forme de ditcionnaire.
- Exercice Pratique : Gestion des Activités Étudiantes
Application des concepts de la POO pour modéliser des entités et leurs actions spécifiques.
class Etudiant:
def __init__(self, prenom, age, filiere, passion):
self.prenom = prenom
self.age = age
self.filiere = filiere
self.passion = passion
def etudier(self):
print(f"{self.prenom}, {self.age} ans, {self.filiere}, révisé ses cours à la bibliothèque.")
def pratiquer(self):
print(f"{self.prenom}, {self.age} ans, {self.filiere}, fait du sport au complexe universitaire.")
def socialiser(self):
print(f"{self.prenom}, {self.age} ans, {self.filiere}, partage sa passion pour {self.passion}.")
# Création des objets
alice = Etudiant('Alice', 20, 'Informatique', 'le jazz')
bob = Etudiant('Bob', 22, 'Mathématiques', 'les échecs')
charlie = Etudiant('Charlie', 19, 'Physique', 'la photographie')
# Exécution des méthodes
alice.etudier()
alice.pratiquer()
alice.socialiser()
bob.etudier()
bob.pratiquer()
bob.socialiser()
charlie.etudier()
charlie.pratiquer()
charlie.socialiser()