Téléchargez aux formats PDF ou lisez en ligne sur Scribd
Université De Kairouan “Année universitaire 2017- 2018
Institut Préparatoire aux Etudes Heritage
sn . 2MP & ZTECHNO & 2PC
d’Ingénieurs de Kairouan
(IPEIK)
Heritage simple
L'héritage est une relation de spécialisation/généralisation entre deux
classes. Elle indique qu'une classe dite classe fille spécialise une autre classe
dite classe mere, ic. qu'elle possade les attributs et les méthodes de la classe
mére plus d’autres qui lui sont propres. On parle aussi de super classe et
de sous classe
Syntaxe générale
class classeMere:
‘une classe mére’
class classeFille(classeMere):
‘une classe fille héritant de la classe mére’
Exemple 1.1. Un héritage entre une classe "rectangle" et une classe
"pavé droit"
Un pavé droit pouvant étre vu comme un rectangle a trois dimensions,
ie, un rectangle bien spécial, la relation d'héritage suivante a bien du sens
class rectangle:
gestion de rectangles’
class paveDroit(rectangle)
gestion de bottes 4 chaussures’
La visibilité protégéePour I'instant nous avons rencontré deux types de visibilité pour les attributs :
+ publique : les attributs sont accessibles de partout.
+ privée : les attributs ne sont accessibles qu’au sein de la classe.
lest facile de comprendre que cela est insuffisant pour respecter au mieux
une relation d'héritage. On aimerait en effet avoir la possibilité pour un
attribut d'étre manipulable par les classes filles de sa propre classe. Nous
allons donc avoir besoin d'une troisiéme sorte de visibilité.
Cette remarque conduit a la définition suivante : un attribut est dit protégé si
son utilisation est limitée a la classe et ses descendantes.
Pour déclarer un attribut de fagon protégée, lors de l'implémentation de la
méthode _init_ on fera précéder son nom par un simple underscore :
def _init_(self,para1,para2,.
attributPublic = valeur
_attributProtege = valeur
_attributPrive = valeur
Exemple : Une classe "rectangle"
Les attributs de notre classe mére "rectangle" vont étre déclarés protégés :
class rectangle:
def _init_(selfx,y)
self_x=x
self_y=y
def surface(self)
return self,_x*self._y
Le constructeur de la classe filleOn devra respecter une régle fondamentale : le constructeur de la classe fille
doit faire un appel explicite au constructeur de la classe mére afin d’initialiser
les attributs hérités de celle-ci. Pour cela on aura deux syntaxes 3 notre
disposition.
Dans la premiére syntaxe possible, on fait précéder _init_ du nom de la
classe mére :
class classeFille(classeMere):
"" documentation de la classe fille™"”
def _init_(selfpara1,para2,..):
classeMere._init_(self,paral....)
Exemple :Une classe "pavé droit" héritant de la classe "rectangle",
premiére syntaxe
Le constructeur de la classe "pavé droit” appelle celui de sa classe mére
"rectangle" avec la syntaxe rectangle__init_(..) :
class paveDroit(rectangle):
def _init_{selfx,y,z):
rectangle._init_(selfxy)
sel_z=z
def volume(selt):
return self._x*self_y*self.
photo = rectangle(3,4)
print(photo.surface())
weston = paveDroit(3,4,10)
print(weston.volume())
12120
Dans la seconde syntaxe autorisée, on fait précéder _init_ du mot
clé superQ):
class classeFille(classeMere):
" documentation de la classe fille’
def _init_(selfpara1,para2,
super()._init_(paral...)
Exemple Une classe "pavé droit" héritant de la classe “rectangle”,
seconde syntaxe
Le constructeur de la classe "pavé droit” appelle celui de sa classe mére
"rectangle" avec la syntaxe super(),_init_(...) :
class paveDroit(rectangle)
def _init_(self-xy,z):
super()._init_(xy)
self_z=z
def volume(self):
return self_x*self_y*self._z
Transmission des membres
On va ici revenir via des exemples sur la transmission des membres (attributs
et méthodes) selon leur visibilité. Cela permettra de fixer définitivement les
idées.
Les définitions de visibilité :
+ publique : les membres sont accessibles de partout.
+ protégé : les membres ne sont accessibles qu’au sein de la classe et de
ses descendantes.
+ privée : les attributs ne sont accessibles qu’au sein de la classe.Exemple : Un membre public
Ici on utilise sans soucis une méthode publique de la classe mére dans la
classe fille. Pour cela on fait précéder le nom de la méthode par le mot
clé superQ):
class paveDroit(rectangle)
def _init_(selfx,y,2):
super()._init_(xy)
self_z=2
def volume(self):
return super().surface()*self._z
Méme chose avec une autre syntaxe, oi cette fois ci le nom de la méthode est
précédée par le mot clé self
class paveDroit(rectangle)
def _init_(selfxy.z):
super()._init_(xy)
self,_2z=
def volume(self):
return self.surface()*self_z
Exemple 1.7. Des membres protégés
Ici on utilise sans problémes des attributs protégés de la classe mére dans la
classe fille:
class paveDroit(rectangle):
def _init_(self,x,y,z):
rectangle._init_(self,x,y)
self._;
def volume(self):return self._x*self.,
Exemple 1.8. Des membres privés
Ici on constate l'utilisation impossible d’attributs privés de la classe mére
dans la classe fille :
class rectangle:
def _init_(selfx,y)
self._x=x
self_y=y
def surface(selt)
return self._x*self_y
class paveDroit(rectangle)
def _init_(selfx,y,z):
rectangle._init_(selfxy)
self._;
def volume(selt):
return self._x*self__y*self_z
santoni = paveDroit(2,3,4)
print(santoni.volume())
AttributeError: 'paveDroit’ object has no attribute '_paveDroit_x'