Fondamentaux de la Programmation Orientée Objet en Python : Classes, Objets et Instanciation

  1. É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.

  1. 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.

  1. 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()

Étiquettes: Python Programmation-Orientée-Objet classes instanciation attributs

Publié le 22 juin à 16h36