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.