Maîtrisez l'héritage en Python
Le principe est le suivant :
On définit des classes filles spécialisées à partir d'une classe mère
Les classes dites "filles" héritent des attributs et méthodes de la classe mère
Mais elles y ajoutent leurs propres attributs et méthodes
ce qui permet de les spécialiser tout en maintenant un lien commun entre elles
Exemples
Exemple 1 :

Exemple 2 :

Exemple 3 :

Exemple 4 :br>

Méthode :
On commence par créer la classe mère :
Ici par ex. on va créer une classe mère avion, dotée :

Voici :

#coding utf-8 #class mere
class avion :
   def __init__(self,constructeur, pays):
      self.constructeur= constructeur
      self.nationalite = pays
   def caracterise(self) :
      return "Cet avion est un {} de {} ".format(self.constructeur, self.nationalite)

On peut si l'on veut en créer une instance, par ex nommée avion1, et une autre, nommée avion2, et afficher leurs caractéristiques, ainsi :

avion1=avion("SUKHOI","URSS")
print(avion1.caracterise())
avion2= avion("?", "?")
print(avion2.caracterise())


Voici le résultat :

Ensuite, on va créer des classes filles :
#classes filles


class fighter(avion) :
def __init__(self,constructer, payss,nom,vitesse):
avion.__init__(self,constructer,payss)
self.nom=nom
self.vitesse=vitesse
def vole(self) :
return "Il s'agit d'un {} de {},{} qui vole à {}".format(self.nom, self.constructeur, self.nationalite,self.vitesse)

class liner(avion) :
def __init__(self,constructer, payss,nom,passagers):
avion.__init__(self,constructer,payss)
self.nom=nom
self.passagers=passagers
def vole(self) :
return "Il s'agit d'un {} de {},{} qui transporte {} passagers".format(self.nom, self.constructeur, self.nationalite,self.passagers)

class aeroclub(avion) :
def __init__(self,constructer, payss,nom,specialite):
avion.__init__(self,constructer,payss)
self.nom=nom
self.specialite=specialite
def utilisation(self) :
return "Il s'agit d'un {} de {},{} qui est spécialisé dans {} ".format(self.nom, self.constructeur, self.nationalite,self.specialite)


On note que :
Dans chaque classe fille doivent obligatoirement apparaître deux constructeurs :
1/ Le constructeur propre à la classe fille créée, avec ses propres arguments spécialisés, dont :
- en premier les arguments réclamés par la classe mère, avec des identifiants qui peuvent être différents de ceux définis dans la classe mère :
Par ex constructer et payss au lieu de constructeur et pays
- en second, la liste des arguments propres à la classe fille considérée:
Par ex.:
nom et vitesse pour la classe fille fighter
nom et passagers pour la classe fille liner
nom et specialite pour la classe fille aeroclub
2/ Le constructeur de la classe mère qui est répété :
- avion.__init__(self,constructer,payss) pour chacune des classes filles

Enfin dans la classe fille on définira les méthodes spécialisées spécifiques à chaque classe fille créée :
- vole() pour la classe fighter et la classe liner mais adaptée pour chacune
- utilisation() pour la classe aeroclub

On note que les attributs créés dans la classe mère resteront disponibles dans chaque classe fille,
avec mise à jour éventuelle dans les classes filles
Mais :
Dans chaque classe fille on crée et habille aussi les attributs spécifiques à la classe :
nom et vitesse pour la classe fille fighter
nom et passagers pour la classe fille liner
nom et specialite pour la classe fille aeroclub

On peut maintenant créer des instances :
# instance fighter

F104 = fighter("LOCKHEED","USA","Starfighter","Mach2")
print(F104.caracterise())
print(F104.vole())
print('\n')

# instance liner

SuperG = liner("LOCKHEED","USA","Super-Constellation","220")
print(SuperG.caracterise())
print(SuperG.vole())
print('\n')

# instance aeroclub

PTP= aeroclub("PILATUS","SUISSE", "TurboPorter","le largage de Parachutistes")
print(PTP.caracterise())
print(PTP.utilisation())
print('\n')

# instance liner

DC3 = liner("Douglas","USA","Dakota","90")
print(DC3.caracterise())
print(DC3.vole())
print('\n')

# instance fighter

M3 = fighter("DASSAULT","France","Mirage3","Mach1.8")
print(M3.caracterise())
print(M3.vole())
print('\n')


Et voici le résultat de l'exécution :

Nous allons maintenant créer une classe bateau avec 2 classes filles :
- Tanker
- Yacht
Voici :
#class mere


class bateau :
def __init__(self,longueur, tirantdeau):
self.longueur= longueur
self.tirantdeau = tirantdeau
def navigue(self) :
return "Ce bateau a une longueur de {} mètres et un tirant d'eau de {} mètres ".format(self.longueur, self.tirantdeau)

Un bateau a deux attributs : longueur et tirantdeau
Et une méthode : navigue()
On peut dès lors en créer une instance, si l'on veut :

bateau1= bateau("185", "20")
print(bateau1.navigue())
print('\n')

Voici le résultat de l'exécution :

Nous allons maintenant créer les classes filles :
#classes filles

class tanker(bateau) :
def __init__(self,longueur, tirantdeau,fonction,nom, portdattache):
bateau.__init__(self, longueur,tirantdeau)
self.fonction=fonction
self.nom=nom
self.portdattache=portdattache
def carac(self) :
return "C'est un {} qui s'appelle {},son port d'attache est {} ".format(self.fonction, self.nom, self.portdattache)


class yacht(bateau) :
def __init__(self,longueur, tirantdeau,nom, portdattache):
bateau.__init__(self, longueur,tirantdeau)
self.nom=nom
self.portdattache=portdattache
def sacarac(self) :
return "Ce superbe bateau s'appelle {} et son port d'attache est {} ".format( self.nom, self.portdattache)


Et nous créons maintenant des instances de classes filles :
#instances

t1 = tanker("280", "30", "pétrolier","AMOCO CADIZ", "MONROVIA")
print(t1.navigue())
print(t1.carac())
print('\n')

ta = tanker("250", "22", "pétrolier","MONTEBELLO", "WILMINGTON, DEL")
print(ta.navigue())
print(ta.carac())
print('\n')

t2 = tanker("260", "30", "pétrolier","TORREY CANYON", "PANAMA")
print(t2.navigue())
print(t2.carac())
print('\n')

t3 = tanker("300", "35", "pétrolier","EXXON VALDEZ", "NASSAU,BAHAMAS")
print(t3.navigue())
print(t3.carac())
print('\n')

y1 = yacht("100","10","PRINCESS OF THE SEAS", "GEORGE TOWN, CI")
print(y1.sacarac())
print('\n')

y2 = yacht("100","10","TABOGA IV", "ROAD HARBOUR, BVI")
print(y2.sacarac())
print('\n')

y3 = yacht("90","10","LASCIA FARE", "VALLETTA")
print(y3.sacarac())
print('\n')


Et voici le résultat de l'exécution :