Python: Héritage: Difference between revisions

From Wiki Cours
Jump to navigation Jump to search
mNo edit summary
Line 12: Line 12:
         self.data_a = d
         self.data_a = d
     def f_a(self):
     def f_a(self):
         print "Je suis de la classe A"
         print("Je suis de la classe A")


class B(A): # la classe B dérive de A
class B(A): # la classe B dérive de A
Line 19: Line 19:
         self.data_b = b
         self.data_b = b
     def f_b(self):
     def f_b(self):
         print "Je suis de la classe B"
         print("Je suis de la classe B")


b = B(3,4)
b = B(3,4)
Line 35: Line 35:
class HomoHabilis:
class HomoHabilis:
     def caracteristique(self):
     def caracteristique(self):
         print "taille des pierres"
         print("taille des pierres")


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


moi = HomoSapiens()
moi = HomoSapiens()
Line 64: Line 64:
      
      
T = Tableau(range(10))
T = Tableau(range(10))
print T
print(T)
print T[3:7]
print(T[3:7])
</source>
</source>
puis redéfinir (surcharger) des méthodes pour les spécialiser
puis redéfinir (surcharger) des méthodes pour les spécialiser
Line 81: Line 81:
L1, L2 = list(range(5)), list(range(5,10))
L1, L2 = list(range(5)), list(range(5,10))
T1, T2 = Tableau(range(5)), Tableau(range(5,10))
T1, T2 = Tableau(range(5)), Tableau(range(5,10))
print L1+L2
print(L1+L2)
print T1+T2
print(T1+T2)
</source>
</source>

Revision as of 14:05, 6 September 2016

<--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)