Aller au contenu

Exemples — POO#

Classe complète avec propriétés et validation#

class CompteBancaire:
    def __init__(self, titulaire, solde=0):
        self.titulaire = titulaire
        self._solde = solde

    @property
    def solde(self):
        return self._solde

    def deposer(self, montant):
        if montant <= 0:
            raise ValueError("le montant doit être positif")
        self._solde += montant

    def retirer(self, montant):
        if montant > self._solde:
            raise ValueError("solde insuffisant")
        self._solde -= montant

    def __repr__(self):
        return f"CompteBancaire({self.titulaire!r}, {self._solde})"

    def __eq__(self, autre):
        if not isinstance(autre, CompteBancaire):
            return NotImplemented          # laisse Python essayer l'opération inverse
        return (self.titulaire, self._solde) == (autre.titulaire, autre._solde)

    def __hash__(self):
        return hash((self.titulaire, self._solde))   # définir __eq__ annule le __hash__ par défaut

Héritage et polymorphisme#

class Animal:
    def __init__(self, nom):
        self.nom = nom

    def parler(self):
        raise NotImplementedError

class Chien(Animal):
    def parler(self):
        return f"{self.nom} aboie"

class Chat(Animal):
    def parler(self):
        return f"{self.nom} miaule"

for animal in [Chien("Rex"), Chat("Milo")]:
    print(animal.parler())

Classe itérable#

class Plage:
    def __init__(self, debut, fin):
        self.debut = debut
        self.fin = fin

    def __iter__(self):
        n = self.debut
        while n < self.fin:
            yield n
            n += 1

for x in Plage(0, 5):
    print(x)

Composition plutôt qu'héritage#

class Moteur:
    def demarrer(self):
        return "vroum"

class Voiture:
    def __init__(self):
        self.moteur = Moteur()   # a-un Moteur, plutôt qu'hérite de Moteur

    def demarrer(self):
        return self.moteur.demarrer()