Python: Héritage: Difference between revisions

From Wiki Cours
Jump to navigation Jump to search
No edit summary
 
(3 intermediate revisions by the same user not shown)
Line 9: Line 9:
<source lang="py">
<source lang="py">
class A:  # classe parente
class A:  # classe parente
    data_a = 0
     def __init__(self,d=1):
     def __init__(self,d=1):
         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
    data_b = 0
     def __init__(self,d=2,b=1):
     def __init__(self,d=2,b=1):
         A.__init__(self,d)  # appelle le constructeur de la classe parente
         A.__init__(self,d)  # appelle le constructeur de la classe parente
         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)
b.f_a()
b.f_a()
b.f_b()
b.f_b()
print b.data_a, b.data_b
print(b.data_a, b.data_b)
a = A()
a = A()
a.f_a()
a.f_a()
Line 33: Line 31:


== Un exemple ==
== Un exemple ==
<source lang="py">
<source lang="py">
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()
moi.caracteristique()
moi.caracteristique()
</source>
== L'héritage comme spécialisation ==
On peut récupérer toutes les fonctionnalités d'une classe sous un nouveau type
<source lang="py">
class Tableau(list):
    "une manière simple de renommer le type list"
   
T = Tableau(range(10))
print(T)
print(T[3:7])
</source>
puis redéfinir (surcharger) des méthodes pour les spécialiser
<source lang="py">
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)
</source>
</source>

Latest revision as of 12:56, 1 November 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)