A première vue, les notions d’orienté objet sont simple en Python par rapport à Java, mais même si l’encapsulation ,n’existe pas en tant que tel (voir le mangling en Python), il y a beaucoup de choses à apprendre en héritage dans Python.
Il y a les fonctions magiques (avec le dunder) pour faire du polymorphisme et l’héritage multiple comme en C++ !
Classe et héritage simple
class Kite:
def __init__(self,max_altitude):
self.max_altitude = max_altitude
def do(self):
return "I fly"
def getMaxAltitude(self):
return self.max_altitude
class BigKite(Kite):
def __init__(self,max_altitude,weight):
self.max_altitude = max_altitude
self.weight = weight
def getWeight(self):
return self.weight
Ici BigKite hérite de Kite, et la méthode de constructeur __init__ est surchargée. Si nous voulons utiliser le constructeur de la classe parente :
class Kite:
def __init__(self,max_altitude):
self.max_altitude = max_altitude
def do(self):
return "I fly"
def getMaxAltitude(self):
return self.max_altitude
class BigKite(Kite):
def __init__(self,max_altitude,weight):
super().__init__(max_altitude) #appel classe parente
self.weight = weight
def getWeight(self):
return self.weight
On aurait pu écrire aussi :
super(Kite,self).__init__(max_altitude)
Héritage multiple
Ici KiteSurf hérite de la classe Kite et de la classe Surf, qui elles-même héritent de Object, on est ici en présence de diamond problem

class Object:
def __init__(self):
pass
def do(self):
return "I exist"
class Kite(Object):
def __init__(self,max_altitude):
self.max_altitude = max_altitude
def do(self):
return "I fly"
def getMaxAltitude(self):
return self.max_altitude
class Surf(Object):
def __init__(self,matter):
self.matter = matter
def do(self):
return "I surf"
def getMaxAltitude(self):
return self.max_altitude
class KiteSurf(Surf,Kite):
def __init__(self):
pass
ks = KiteSurf()
print(ks.do())
L’affichage de ks.do() méthode existant dans Kite et dans Surf dépend de l’ordre dans lequel est passé en paramètre les classes parentes.