Académique Documents
Professionnel Documents
Culture Documents
1. Introduction
2. Partie1: Première approche des Classes
a. Le Constructeurs
Module : Informatique
b. Attributs et méthodes de la classe
Classes: 2ème Années MP – PC –T
c. Le paramètre « self »
Chapitre 2 - Approche d. Méthodes de classe et Méthodes statiques
3. Partie2: Encapsulation et Héritage simple
Orientée Objet et a. Encapsulation: property
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 1/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 2/65
q Code réutilisable pour contenir les coûts du développement, Ø Mais aussi les opérations qui peuvent leurs être appliquées.
q Coordonner et répartir le travail de développement, Ø Le programmeur peut définir des relations entre les objets.
q Modularité du code.
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 3/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 4/65
Pourquoi utiliser des objets ?
q Le langage C (inventé au début des années 1970) est parmi les
premiers langages de programmation n'incluaient pas l'orienté objet.
Ø Il aura fallu attendre le C++ (début 80) pour utiliser la puissance de
Partie 1: l'orienté objet dans une syntaxe proche de celle du C.
Première approche des q Java, un langage apparu à peu près en même temps que Python
(début des années 90), définit une philosophie assez différente de
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 7/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 8/65
Le constructeur (1/7) Le constructeur (2/7)
Exemple 1:
q Pour définir les attributs de notre objet, il faut définir une
1. class Personne : #Définition de notre classe Personne
méthode spéciale appelée « un constructeur » dans notre
2. """Classe définissant une personne caractérisée
classe.
3. par :
q Ce constructeur est appelé invariablement quand on souhaite 4. - son nom
créer un objet depuis notre classe. 5. - son prénom
q Concrètement, un constructeur est une méthode de notre objet 6. - son âge
se chargeant de créer nos attributs. 7. - son lieu de résidence"""
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 9/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 10/65
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 13/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 14/65
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 15/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 16/65
Attributs de classe (2/2) Les méthodes de la classe (1/3)
q Les attributs sont des variables propres à l’objet, qui servent à le
1. >>> Compteur.objets_crees
2. 0 caractériser.
3. >>> a = Compteur() #On crée un premier objet q Les méthodes sont plutôt des actions agissant sur l'objet.
4. >>> a.objets_crees #accès à travers l’objet
5. 1 Ø Par exemple, la méthode « append » de la « classe list »
6. >>> Compteur.objets_crees #à travers la classe permet d'ajouter un élément dans « l'objet list » manipulé.
7. 1 Exemple:
8. >>> b = Compteur() #On crée un 2eme objet
9. >>> Compteur.objets_crees q C’est un exemple de modélisation d’un tableau d’affichage,
10.2 q Notre tableau va posséder une surface (un attribut) sur laquelle
11.>>> a.objets_crees, b.objets_crees on pourra écrire, que l'on pourra lire et effacer.
12.(2,2)
13.>>> id(a) == id(b) q Le constructeur est en effet une méthode, elle en garde la
14.False syntaxe.
q Nous allons donc écrire la méthode « ecrire ».
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 17/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 18/65
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 19/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 20/65
Le paramètre « self » (1/2) Le paramètre « self » (2/2)
q Dans les méthodes d'instance, qu'on appelle également des méthodes 1. >>> tab.ecrire
d'objet, on trouve dans la définition ce paramètre « self », 2. <bound method TableauAffiche.ecrire of
Ø « self » c’est l’équivalent de l’objet courant « this » en Java et C++. <__main__. TableauAffiche object at 0 x00B3F3F0
>>
q Une chose qui a son importance :
3. >>> TableauAffiche.ecrire
Ø Quand on a créé un nouvel objet, les attributs sont propres à l'objet 4. <function ecrire at 0 x00BA5810 >
créé. 5. >>> help (TableauAffiche.ecrire)
Ø Si on a créé plusieurs tableaux d’affichage, ils ne vont pas tous avoir 6. Help on function ecrire in module __main__ :
la même surface. 7. ecrire (self, message_a_ecrire )
Ø Donc les attributs sont contenus dans l'objet. 8. Méthode permettant d'écrire sur la
9. surface du tableau. Si la surface n'est
q En revanche, les méthodes sont contenues dans la classe qui définit
10.pas vide, on saute une ligne avant de
notre objet.
11.rajouter le message à écrire
Ø C'est très important. Quand on tape « tab.ecrire(...) », 12.>>> TableauAffiche.ecrire(tab, "essai")
vPython va chercher la méthode « ecrire » non pas dans l'objet 13. #même que tab.ecrire("essai")
tab, 14.>>> tab.surface
vmais dans la classe TableauAffiche. 15.'essai’
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 21/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 22/65
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 25/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 26/65
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 27/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 28/65
Remarques La fonction « dir » (1/3)
q La fonction « dir() », elle prend en paramètre un objet et
q Retenez surtout que les attributs et les méthodes d'instance, renvoie la liste de ses attributs et méthodes.
c'est eux qu’on les retrouve la plupart du temps. 1. class Test :
2. """Une classe de test tout simplement"""
q Les noms de méthodes encadrés par deux soulignés de part et
3. def __init__ (self):
d'autre sont des méthodes spéciales.
4. """On définit dans le constructeur
Ø Ne nommez pas vos méthodes ainsi. 5. un unique attribut"""
6. self.mon_attribut = "ok"
Ø Nous découvrirons plus tard ces méthodes particulières.
7. def afficher_attribut (self):
Ø Exemple de nom de méthode à éviter : __MaMethode__. 8. """Méthode affichant l'attribut
9. 'mon_attribut '"""
10. print ("Mon attribut est {0}.".
11. format (self.mon_attribut))
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 29/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 30/65
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 31/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 32/65
L'attribut spécial __dict__ (1/2) L'attribut spécial __dict__ (2/2)
q Par défaut, quand on développe une classe, tous les objets q Toutes modifications de ce dictionnaire entraine la modification
construits depuis cette classe posséderont un attribut spécial des attributs de l’objet aussi !
__dict__. 1. >>> un_test.__dict__ ["mon_attribut"] = "plus ok"
q Cet attribut est un dictionnaire qui contient comme clés les 2. >>> un_test.mon_attribut
noms des attributs et, en tant que valeurs, les valeurs des 3. ‘plus ok’
attributs. 4. >>> un_test.afficher_attribut ()
1. >>> un_test = Test () 5. Mon attribut est plus ok.
2. >>> un_test.mon_attribut q De manière générale, on évite ce genre de syntaxe!
3. 'ok' Ø Il est plus propre d'écrire:
4. >>> un_test.__dict__ vobjet.attribut = valeur que
5. {'mon_attribut': 'ok'} vobjet.__dict__[nom_attribut] = valeur.
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 33/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 34/65
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 35/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 36/65
Encapsulation (1/2)
q Nous allons découvrir dans cette partie les propriétés,
Ø C’est un concept propre à Python et à quelques autres
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 37/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 38/65
q Concrètement, au lieu d'écrire mon_objet.mon_attribut, Ø ou alors mettre à jour un attribut dès qu'un autre attribut est
modifié.
Ø on écrit: mon_objet._get_mon_attribut()
q Les cas sont multiples et c'est très utile de pouvoir contrôler
q De la même manière, pour modifier l'attribut on écrit:
l'accès en lecture ou en écriture sur certains attributs de notre
Ø mon_objet._set_mon_attribut(valeur)
objet.
et non pas
Ø mon_objet.mon_attribut = valeur
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 39/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 40/65
Encapsulation: Inconvénient Encapsulation: Les propriétés (1/2)
q L'inconvénient de devoir écrire des accesseurs et mutateurs, q En C++ ou en Java par exemple, dans la définition de classe, on
met en place des principes d'accès qui indiquent si l'attribut (ou le
Ø Il faut créer deux méthodes pour chaque attribut de la
groupe d'attributs) est privé ou public.
classe.
Ø D'abord, c'est assez lourd. Ø Si l'attribut est public, on peut y accéder depuis l'extérieur de
la classe et le modifier.
Ø Ensuite, nos méthodes se ressemblent plutôt.
Ø S'il est privé, on ne peut pas. On doit passer par des
q Certains environnements de développement proposent,
accesseurs ou mutateurs.
Ø De créer ces accesseurs et mutateurs pour nous,
q En Python, il n'y a pas d'attribut privé. Tout est public!
automatiquement.
Ø Mais cela ne résout pas vraiment le problème! q Les propriétés sont un moyen transparent de manipuler des
attributs d'objet.
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 41/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 42/65
Ø Ou dire qu'un attribut ne sera visible qu'en lecture et non Ø la méthode donnant accès à l'attribut ;
modifiable. Ø la méthode modifiant l'attribut ;
q Pour l'utilisateur, c'est absolument transparent : il croit avoir un Ø la méthode appelée quand on souhaite supprimer l'attribut ;
accès direct à l'attribut. Ø la méthode appelée quand on demande de l'aide sur l'attribut.
Ø C'est dans la définition de la classe que on précise que tel ou q En pratique, on utilise surtout les deux premiers paramètres :
tel attribut doit être accessible ou modifiable grâce à certaines
Ø Ceux définissant les méthodes d'accès et de modification,
propriétés.
autrement dit l’accesseur et le mutateur d'objet.
q Les propriétés sont des objets un peu particuliers de Python. Ø Pour plus d’information taper dans le « Shell » la commande:
Ø Elles prennent la place d'un attribut et agissent différemment 1. >>> help(property)
en fonction du contexte de l’appel.
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 43/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 44/65
Encapsulation: property (2/7) Encapsulation: property (3/7)
>>> help (property) 1. class Personne :
2. def __init__(self,nom,prenom):
Help on class property in module builtins: 3. self.nom = nom; self.prenom = prenom; self.age = 23
class property(object) 4. self._lieu_residence = "Nabeul"
| property(fget=None, fset=None, fdel=None, doc=None) -> 5. def _get_lieu_residence(self):
property attribute 6. """Méthode qui sera appelée quand on souhaitera
7. accéder en lecture à l'attribut «lieu_residence»"""
| fget is a function to be used for getting an attribute
8. print("On accède à l'attribut lieu_residence!")
value, and likewise
9. return self._lieu_residence
| fset is a function for setting, and fdel a function for 10. def _set_lieu_residence(self, nouvelle_residence):
del'ing, an attribute. Typical use is to define a 11. """Méthode appelée quand on souhaite modifier le
managed attribute x: 12. lieu de résidence """
| class C(object): 13. print("Attention, {} déménage à {}.".format( \
| def getx(self): return self._x 14. self.prenom, nouvelle_residence))
15. self._lieu_residence = nouvelle_residence
| def setx(self, value): self._x = value 16. #On va dire à Python que notre attribut
| def delx(self): del self._x 17. # «lieu_residence» pointe vers une propriété
| x = property(getx,setx,delx,"I'm the 'x' property.") 18. lieu_residence = property(_get_lieu_residence,\
19. _set_lieu_residence)
...
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 45/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 46/65
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 47/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 48/65
Encapsulation: property (6/7) Encapsulation: property (7/7)
q Attribut accessible en lecture seulement: Accesseur q Attribut accessible en écriture seulement: Mutateur
lieu_residence = property(_get_lieu_residence) lieu_residence = property(None,_set_lieu_residence)
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 49/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 50/65
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 53/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 54/65
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 55/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 56/65
Héritage simple (5/7) Héritage simple (6/7)
1. >>> p = Personne("Tounsi") q On remarque que le constructeur de la classe « Personne » n'est
2. >>> print(p) pas appelé à la création d’un objet de type « Etudiant »
3. Mohamed Tounsi Ø mon_objet.ma_methode() est la même que :
4. >>> p.prenom MaClasse.ma_methode(mon_objet)
5. 'Mohamed' Ø Donc, on peut se servir de cette notation pour appeler une
6. >>> e = Etudiant("Nabli","ST5") méthode précise d'une classe précise
1. class Etudiant(Personne):
7. >>> print(e)
2. def __init__ (self, nom, matricule):
8. Etudiant Nabli, matricule ST5 3. #on appel explicitement le constructeur
9. >>> e.prenom 4. #de Personne
10. Traceback (most recent call last): 5. Personne.__init__(self, nom)
11. File "<pyshell#15>", line 1, in <module> 6. self.matricule = matricule
12. e.prenom 7. def __str__ (self):
13. AttributeError: 'Etudiant' object has no attribute
8. return “Etudiant {0}, matricule {1}”\
'prenom' 9. .format(self.nom, self.matricule)
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 57/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 58/65
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 59/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 60/65
La classe « object » (2/3) La classe « object » (3/3)
1. >>> e = Etudiant("Tounsi", "ST4")
2. Attention, on modifie l'attribut nom de l'objet ! q En redéfinissant la méthode __setattr__, on ne peut, dans
3. Attention, on modifie l'attribut prenom de l'objet ! le corps de cette méthode, modifier les valeurs de nos attributs
4. Attention, on modifie l'attribut matricule de l'objet ! comme on le fait habituellement (self.attribut = valeur)
5. >>> e.prenom car la méthode s'appellerait elle-même!
6. 'Mohamed' q On fait appel à la méthode __setattr__ de la classe
7. >>> e.nom = "Nabli" object, cette classe dont héritent implicitement toutes nos
8. Attention, on modifie l'attribut nom de l'objet ! classes.
9. >>> dir(object) q On est sûr que la méthode de cette classe sait écrire une valeur
10.['__class__', '__delattr__', '__dir__', '__doc__', dans un attribut,
'__eq__', '__format__', '__ge__', '__getattribute__',
'__gt__', '__hash__', '__init__', '__le__', '__lt__', Ø alors que nous ignorons le mécanisme et que nous n'avons
'__ne__', '__new__', '__reduce__', '__reduce_ex__', pas besoin de le connaître !
'__repr__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__']
11.>>>
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 61/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 62/65
Deux fonctions très pratiques (1/2) Deux fonctions très pratiques (2/2)
q Python définit deux fonctions qui peuvent se révéler utiles dans
q isinstance : permet de savoir si un objet est issu d'une classe
bien des cas : issubclass() et isinstance().
ou de ses classes filles :
q issubclass : Comme son nom l'indique, elle vérifie si une 1. >>> e = Etudiant("Tounsi", "ST4")
classe est une sous-classe d'une autre classe. 2. >>> isinstance(e, Etudiant)
Ø Elle renvoie True si c'est le cas, False sinon : 3. True
4. >>> isinstance(e, Personne)
1. >>> issubclass (Etudiant, Personne) 5. True
2. True 6. >>> isinstance(e, object)
3. >>> issubclass (Etudiant, object) 7. True
4. True
5. >>> issubclass (Personne, object) 8. >>> p = Personne("Tounsi")
6. True 9. >>> isinstance(p, Etudiant)
7. >>> issubclass (Personne, Etudiant) 10.False
8. False
IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 63/65 IPEIN 2021/2022 2ème Année - Informatique - Chapitre 2 64/65
Remarques
q « 5 » : objet de la classe « int »:
1. >>> type(5); isinstance(5,int)
2. <class 'int'>
3. True
q « int » : est un type de l’objet « 5 » et au même temps un
objet de la classe « type »:
1. >>> type(int); isinstance(int,type)
2. <class 'type‘>
3. True
q « type » : est le type de toutes les classes et au même temps
un objet de la classe « object »:
1. >>> isinstance(type,object)
2. True