Autour du codeDevelopper toujours mieux
Posté le

Les bases de la POO en Python l'héritage

L'héritage simple

L'héritage permet de créer une classe à partir d'une autre que l'on appelle classe de base ou classe mère. La classe ainsi créée possédera tous les attributs et méthode de la classe mère.

Pour illustrer ça, nous allons faire une classe Counter. Jusque la rien de nouveau

class Counter:
    def __init__(self, i=0):
        self._i = i

    def incremente(self):
        self._i += 1

    def value(self):
        return self._i

Voici l'exemple

>>> c = Counter()
>>> c.incremente()
>>> c.incremente()
>>> c.value()
2

Maintenant si l'on souhaite avoir une classe comme Counter, mais qui puisse aussi décompter, on va hériter de Counter

class ReverseCounter(Counter): # On donne la classe mere ici.
    def decremente(self):
        self._i -= 1 # _i est un attribut hérité de Counter

Notre classe ReverseCounter peut faire ce que fait Counter car elle possède la méthode incremente

>>> nb_mouton = ReverseCounter()
>>> nb_mouton.incremente()
>>> print(nb_mouton.value())
1
>>> nb_mouton.decremente()
>>> print(nb_mouton.value())
0

ReverseCounter a également hérité de la méthode __init__

>>> nb_mouton = ReverseCounter(33)
>>> nb_mouton.decremente()
>>> print(nb_mouton.value())
32

On dit que ReverseCounter hérite ou dérive de Counter avec l'héritage, on doit pouvoir utiliser un objet ReverseCounter là où l'on utilise un Counter. La fonction isinstance permet de savoir si un objet est l'instance d'une classe donnée ou d'une classe mère.

>>> rc = ReverseCounter()
>>> c = Counter()
>>> print(isinstance(c, Counter))
True
>>> isinstance(rc, Counter) # ReverseCounter est un Counter
True
>>> isinstance(c, ReverseCounter) # L'inverse n'est pas vrais
False

De ce fait, une fonction ou une méthode qui utilise un Counter peut se satisfaire d'un reverseCounter.

L'héritage multiple

Python supporte également l'héritage multiple. Cela veut dire qu'une classe peut hériter de plusieurs autres classes.

class Enseignant:
    def enseigne(self):
        print("enseigne")
    def titre(self):
        print("M")

class Chercheur:
    def cherche(self):
        print("cherche")
    def titre(self):
        print("Dr")

class EnseignantChercheur(Enseignant, Chercheur):
    pass # pass sinifie m'a class est terminé

Dans notre cas la classe EnseignantChercheur hérite de Enseigant et Chercher elle possède donc les méthodes enseigne et cherche.

>>> ec = EnseignantChercheur()
>>> ec.cherche()
cherche
>>> ec.enseigne()
enseigne

Mais que ce passe-t-il si les deux classes mères ont un même nom d'attribut ou méthode ? undecided

C'est simple, c'est la classe déclarée en premier dans la classe fille qui gagne.

>>> ec = EnseignantChercheur()
>>> ec.titre()
M

Voilà, j'espère que compter les moutons ne vous a pas endormi, le prochain chapitre sur la POO traitera de la redéfinition de méthode. n'hésité pas si vous avez des questions et bon code ! smile