Poo Python
Poo Python
Poo Python
Python
1 Les classes et les objets
Une classe est une modélisation d’une entité du monde réel. Elle renferme les donnée de
l’entité et les traitement sur ces données.
Exemple :
la classe Étudiant qui modélise des un ensemble étudiants.
Une classe Voiture qui modélise les voitures.
Notes qui modelise les notes des étudiants.
Etudiant
Note Voiture
nom
codeEtudiant marque
prenom
matiere immatriculation
codeEtudiant
typeEvaluation model
email
coefficient couleur
mobile
note carburant
adresse
setNote() puissance
editer()
update() entretient()
ajouter()
supprime() circulation()
supprime()
afficherMoyen() info()
afficherMoyen()
Une instance, on l’appel aussi occurrence , d’une classe est un objet unique créé à partir de
cette classe.
Exemple :
1
Exemple de création et d’utilisation d’une instance (ou occurrence) de la classe.
o=personne() # Instanciation en appelant le constructeur par défaut.
o.setData("Ahmed","Taha", 33) # Appel de la méthode setData par la notation point
print(o.getData()) # Appel de la méthode getData par la notation point.
p=o # p fait référence a l’objet o
On appel attribut d’une classe tout nom dans l’espace de nommage de la classe. Un attribut
est référencé par la notation point Maclass.nomAttribut.
Personne.setData et Personne.getData sont deux attributs méthodes.
x est définie dans l’espace de nommage global, donc visible pour la fonction g.
x est dans l’espace de nommage local de g ; cet objet n’a aucun lien avec avec x définie dans
l’espace global du programme.
2
g()
x est nommée dans la fonction g, donc la portée est g. c’est un objet local à g et n’a pas de
lien avec x définie précédemment.
x est nommée dans la fonction g, donc la portée est local à g. Mais on tente d’affecter a x la
valeur de x qui est définie dans l’espace de nommage globale : Un espace de nommage ne peut
pas être local et global en mème temps.
3
Exemple. le programme suivant affiche l’exception SyntaxError : no binding for nonlocal ’ville’
found ""
def f() :
nonlocal x
x=x+1
print(x)
x="Hello"
f()
class personne :
def _init_(self, fname, lname, age ) :
self.fname= fname
self.lname = lname
self.age=age
def getData(self ) :
return self.fname+" "+ self.lname+" , agé de "+str(self.age)+" ans".
Exemple : Constructeur sans paramètre. Initialise les champs d’un objet par "TOTO",
"Titi" et 17.
def _init_(self) :
self.fname= "TOTO"
self.lname = "Titi"
self.age=17
4
o=personne()
o.getData() : retourne TOTO Titi agé de 17 ans.
Exemple : Constructeur paramétré. Initialise tous les objets par les valeurs passées en ar-
guments
def _init_(self, fname, lname, age ) :
self.fname= fname
self.lname = lname
self.age=age
1.5 Imbrication
Les objets d’une classe peuvent être appelés dans une autre classe.
Exemple : un objet de la classe "person" a un attribue "birdday" qui est un objet de la classe
date
class date :
def __init__(self, day, mounth, year ) :
self.mounth=mounth
self.day= day
self.year= year
def __str__(self ) :
return str(self.day) + ’/’ + self.mounth+ ’/’ +str(self.age)
class person :
def __init__(self, fname, lname, day, month, year ) :
self.fname= fname
self.lname = lname
self.birdday= date(day, month, year)
5
1.6 Les attributs de classe et les attributs d’instances
Un attribut est un membre à qui on peut accéder en utilisant la notation point.
Une classe peut avoir comme attributs : des variable de type primitifs ou un type d’une autre
classe.
des méthodes qui ont "self" comme premier paramètre. Ces méthodes agissent sur les instance
de la classe.
des fonction, qui n’ont pas le paramètre "self". Ces fonction ne dépendent pas des instances de
la classe.
Une instance peut avoir comme attributs les variable d’instances qui stockent les données. et
des méthodes qui agissent sur ces données.
Exemple :
class animal :
nbre=0
def __init__(self, genre, categorie) :
self.genre=genre
self.categorie=categorie
animal.nbre+=1
def appeler() :
return "Coucou"
la variable "nbre" et la méthode "appeler()" sont des attribut de la classe. Elles ne dé-
pendent pas des instances : leurs valeurs sont les même pour tous les instances de la classe. On
accède à ces attributs en utilisant la notation point.
animal.nbre # Ici, nbre retourne le nombre d’instance crées
animal.appeler()
Les variable "genre" et "categorie " sont des attribut des instances. chaque instance de la classe
"animal" a des données différente des autres.
La méthode __init__() est un attribut de la classe mais qui agit différemment sur chaque
instance.
Exercice : soit le code suivant
a= animale("Tigre", "Felin" )
b= animale("Lion", "Felin" )
c= animal ("vache", "Bovin" )
Vérifier que a.appeler(), b.appeler et c.appeler ont la même valeur.
Même chose pour a.nbre, b.nbre et c.nbre
On prefere noter animal.nbre et animal.appeler().
Vérifier que a.genre, b.genre, c.genre ont des valeurs différentes
2 L’héritage simple
L’héritage permet d’utiliser une classe existante pour en définir une autre classe.
La classe dérivée peut accéder à toutes les méthodes de la classe de base.
Toute instance de la classe dérivée est une instance de la classe de base. Donc elle possède tous
les attributs que possède une instance de la classe de base.
Une classe dérivée peut :
Ajouter des nouvelles méthodes
Redéfinir une méthode de la classe de base
Surcharger une méthode de la classe de base
6
Ajouter des attributs au instances de la classe de base.
la classe "classDerivee" est une classe fille, sous classe ou classe dérivée de la classe "classBase".
"classBase" est la classe mère, classe de base ou super classe de la classe "classDerivee"
la classe "classDerivee" peut être dérivée à son tour.
class deriveeSecond(classDerivee) :
pass
On peut hériter de "deriveeSecond" et ainsi de suite,
Exemple :
class person :
def __init__(self, fname,lname) :
self.fname=fname
self.lname = lname
def__str__(self) :
return "Je suis : "+self.lname+" "+self.fname
class employe(person)
pass
e=employe("toto","titi")
# e instance de employe utilise le constructeur de la classe de base person.
print(e.__str__())
# L’instance e peut accéder aux méthodes de la classe de base person.
print(e.fname)
print(e.lname)
# L’instance e de la classe dérivée "employe" possède tous les attributs que possède une ins-
tance de la classe de base person.
super(classDerivee, self).__init__()
ou simplement par
super().__init__()
Exemple
class person :
def __init__(self, fname,lname) :
self.fname=fname
self.lname = lname
def __str__(self ) :
return "Je suis : "+self.lname+’ ’+self.fname
class employe(person) :
7
def __init__(self,flname,lname, salary) :
super( employe, self ).__init__(flname, lname)
self.salary=salary
class base :
def g(self ) :
return "salut"
class derivee(base) :
def g(self,nom) :
return "salut" + nom
a= base()
b=derivee()
a.g() : # retourne "salut"
b.g("Toto") # retourne "salut toto"
b.g() : # Lève une exception. La méthode g() n’est plus disponible dans classe fille
3 Héritage multiple
Python autorise l’héritage multiple. C’est à dire une classe peut être derivée de plusieur
classe à la fois. la syntaxe est :
8
class calassderive( classe1, class2,..., classN)
Bien que ce type d’héritage est autorisé il est préférable de l’éviter car il présente beaucoup
d’anomalie dans son implémentation.