Python: Héritage

From Wiki Cours
Jump to navigation Jump to search

<--Sommaire

Il peut exister une hiérarchie naturelle entre objets dans le sens que certains sont des spécialisations d'objet plus génériques. Ainsi, on peut dériver une classe d'une autre appelée parente. Dans ce cas, la classe dérivée héritera de tous les attributs et méthodes de la classe parente. On pourra lui en ajouter d'autres mais seule cette classe pourra alors les utiliser.

Déclaration et initialisation

On peut créer une nouvelle classe en la faisant dériver d'une autre classe. Dans ce cas, la classe hérite des attributs et méthodes de la classe mère et on peut lui en ajouter d'autres qui la spécialiseront et auxquelles la classe mère n'aura pas accès. Voici la syntaxe pour que 'B' dérive de 'A', on notera la syntaxe des constructeurs.

class A:   # classe parente
    def __init__(self,d=1):
        self.data_a = d
    def f_a(self):
        print("Je suis de la classe A")

class B(A): # la classe B dérive de A
    def __init__(self,d=2,b=1):
        A.__init__(self,d)  # appelle le constructeur de la classe parente
        self.data_b = b
    def f_b(self):
        print("Je suis de la classe B")

b = B(3,4)
b.f_a()
b.f_b()
print(b.data_a, b.data_b)
a = A()
a.f_a()
a.f_b()  # renvoie une erreur

Un exemple

class HomoHabilis:
    def caracteristique(self):
        print("taille des pierres")

class HomoErectus(HomoHabilis):
    def caracteristique(self):
        HomoHabilis.caracteristique(self)
        print("se tient debout")
    
class HomoNeanderthalensis(HomoErectus):
    def caracteristique(self):
        HomoErectus.caracteristique(self)
        print("un cousin disparu")
    
class HomoSapiens(HomoErectus):
    def caracteristique(self):
        HomoErectus.caracteristique(self)
        print("ecrit en Python")

moi = HomoSapiens()
moi.caracteristique()

L'héritage comme spécialisation

On peut récupérer toutes les fonctionnalités d'une classe sous un nouveau type

class Tableau(list):
    "une manière simple de renommer le type list"
    
T = Tableau(range(10))
print(T)
print(T[3:7])

puis redéfinir (surcharger) des méthodes pour les spécialiser

class Tableau(list):
    "une manière simple de renommer le type list"
    
    def __add__(self,other):
        "additionne les premiers éléments entre eux"
        res = Tableau()
        for i in range(min(len(self),len(other))):
            res += [ self[i]+other[i] ]
        return res

L1, L2 = list(range(5)), list(range(5,10))
T1, T2 = Tableau(range(5)), Tableau(range(5,10))
print(L1+L2)
print(T1+T2)