Académique Documents
Professionnel Documents
Culture Documents
ISMONTIC TETOUAN
LAFHAL JOAIRIA
2023/2024
Introduction
La programmation orientée objet, souvent abrégée POO, permet de
concevoir une application sous la forme d'un ensemble de briques logicielles
appelées des objets.
Chaque objet joue un rôle précis et peut communiquer avec les autres objets.
Les interactions entre les différents objets vont permettre à l'application de
réaliser les fonctionnalités attendues.
Par exemple (voitures) : chaque voiture est différente d’une autre mais elles ont
toutes quatre roues exécutent l’action de diriger ou freiner. Ces éléments communs
en font un concept unique. Une classe.
Plus concrètement, on peut dire qu’une classe est une collection de variables,
méthodes et propriété.
Une classe qui définit un type d’objet a la structure suivante :
✓ Son nom est celui du type que l’on veut créer.
✓ Elle contient les noms et le type des caractéristiques (les variables d’instances)
définissant les objets de ce type.
✓ Elle contient les méthodes applicables sur les objets de la classe.
la différence entre la classe et l'objet
Les classes et les objets sont les composants fondamentaux de la POO.
Le concept d’utilisation de classes et d’objets consiste à encapsuler l’état et le
comportement dans une seule unité de programmation.
Les objets python sont similaires aux objets du monde réel. Par exemple, nous
pouvons créer un objet voiture en python, qui aura des propriétés telles que la vitesse
et la couleur; et un comportement comme: accélérer et freiner.
Exemple :
Déclarer une classe
1. Syntaxe:
class Nom_de_la_classe:
#corps de classe
Par convention en Python, le nom identifiant une classe (qu’on appelle aussi son
identifiant) débute par une majuscule.
Les membres (Les champs et/ou les méthodes) sont définis à l'intérieur du bloc.
Déclarer une classe
2. Instanciation des objets
Instanciation = création d’un objet à partir d’une classe
Objet = instance de classe.
Autrement dit, un objet est une variable conforme à un type, qui est une classe. Les
opérations de l’objet utilisent les valeurs des attributs de l’objet. En outre, un objet
possède une identité qui permet de le distinguer des autres objets.
Par exemple pour créer un objet de type MaClasse, on écrit :
Mon_objet= MaClasse();
#La variable mon_objet référence l’objet crée. On dit que l’objet est une instance de
MaClasse. Une classe définit un nouveau type dans le langage. La POO est d’abord
un modèle de programmation qui permet d’ajouter dans le langage des nouveaux
types d’objet.
Déclarer une classe
3. Tester le type d’un objet
En Python, il existe deux fonctions standards intéressantes pour connaître et tester le
type d’un objet :
type(o): Retourne le type de l’objet passé en paramètre.
Exemple: type(mon_objet) ➔ <class '__main__.MaClasse'>
isinstance(o, cls): Retourne True si l’objet passé en premier paramètre est une
instance de la classe passée en deuxième paramètre.
Exemple: isinstance(mon_objet, MaClasse) ➔True
Déclarer une classe
4. Les champs (les attributs):
Les attributs sont des variables qui sont associées de manière explicite à une classe.
Les attributs de la classe se comportent comme des variables globales pour toutes les
méthodes de cette classe.
Les attributs représentent l’état interne d’un objet.
Pour définir un attribut au sein d'une classe, il suffit :
d'assigner une valeur à cet attribut dans le corps de la classe :
class Cercle:
# Déclaration d'un attribut de classe 'rayon'
# auquel on assigne la valeur 2.
rayon=2
d'assigner une valeur à cet attribut en dehors de la classe. On parle alors d'attribut
dynamique :
class Cercle:
# Le corps de la classe est laissé vide.
pass
# Déclaration dynamique d'un attribut de classe 'rayon'
# auquel on assigne la valeur 2.
Cercle.rayon = 2
print(Cercle.rayon) #>>2
Déclarer une classe
4. Les champs (les attributs):
Les attributs définis ainsi sont appelés « attributs de classe » car ils sont liés à la
classe, par opposition aux « attributs d'instance » dont la vie est liée à l'instance à
laquelle ils sont rattachés. Les attributs de classe sont automatiquement reportés
dans les instances de cette classe et deviennent des attributs d'instance:
class Cercle:
pass
c1=Cercle()
c1.rayon=2
print(c1.rayon) #2
c2=Cercle()
print(c2.rayon) #AttributeError: 'Cercle' object has no attribute 'rayon'
Déclarer une classe
5. Les méthodes:
Les méthodes sont des fonctions qui sont associées de manière explicite à une classe.
Elles ont comme particularité un accès privilégié aux attributs de la classe elle-
même.
Les méthodes sont en fait des fonctions pour lesquelles la liste des paramètres
contient obligatoirement un paramètre explicite qui est l’instance de la classe à
laquelle cette méthode est associée. Ce paramètre est le moyen d’accéder aux
données de la classe.
Syntaxe:
class nom_classe :
def nom_methode(self, param_1, ..., param_n):
# corps de la méthode...
Déclarer une classe
5. Les méthodes:
A part le premier paramètre qui doit de préférence s’appeler self, la syntaxe de
définition d’une méthode ressemble en tout point à celle d’une fonction. Le corps de
la méthode est indenté par rapport à la déclaration de la méthode, elle-même
indentée par rapport à la déclaration de la classe.
Comme une fonction, une méthode suppose que les arguments qu’elle reçoit existe, y
compris self. On écrit la méthode en supposant qu’un objet existe qu’on nomme self.
L’appel à cette méthode obéit à la syntaxe qui suit :
cl = nom_classe() # variable de type nom_classe
cl.nom_methode (valeur_1, ..., valeur_n)
L’appel d’une méthode nécessite tout d’abord la création d’une variable. Une fois
cette variable créée, il suffit d’ajouter le symbole « . » pour exécuter la méthode. Le
paramètre self est ici implicitement remplacé par cl lors de l’appel.
Déclarer une classe
6. Exemple: #création des objets
#déclaration de la classe p1=Personne()
class Personne: print(p1.nom)
#déclaration des attributs p1.nom="Kadiri"
nom="Allali" p1.bienVenue()
prenom="Ahmed" nomC=p1.nomComplet()
age=20 print(nomC)
estMarie=False anneN=p1.anneeNaissan
#déclaration des méthodes ce(2022)
def bienVenue(self): print(anneN)
print("Bonjour")
def nomComplet(self):
return "Nom Complet:"+self.nom +" "+self.prenom
def anneeNaissance(self,anneeActuelle):
return anneeActuelle-self.age
Déclarer une classe
7. Constructeur:
Les constructeurs sont généralement utilisés pour instancier un objet. La tâche des
constructeurs consiste à initialiser (attribuer des valeurs) aux attributs de la classe
lorsqu'un objet de la classe est créé.
En Python, la méthode __init __ () est appelée le constructeur et est toujours
appelée. quand un objet est créé.
Syntaxe:
def __init__(self, liste_parameters):
# Initialisiation
Types de constructeurs:
constructeur par défaut: le constructeur par défaut est un constructeur simple qui
n’accepte aucun argument. Sa définition n’a qu’un seul argument qui soit une
référence à l’instance en cours de construction.
constructeur paramétré: Le constructeur paramétré prend son premier argument
en tant que référence à l'instance en cours de construction, appelée self, et le reste
des arguments est fourni par le programmeur.
Déclarer une classe
7. Constructeur:
Exemple:
class Personne:
def __init__(self,nomIn,ageIn):
self.nom=nomIn
self.age=ageIn
p1=Personne("Allali",20)
p2=Personne("Kadiri",22)
print(p1.nom,"a ",p1.age,"ans") #Allali a 20 ans
print(p2.nom,"a ",p2.age,"ans") #Kadiri a 22 ans
Déclarer une classe
8. Destructeur:
Les destructeurs sont appelés lorsqu'un objet est détruit. En Python, les destructeurs ne
sont pas aussi nécessaires que en C++, car Python dispose d'un ramasse-miettes qui
gère automatiquement la gestion de la mémoire.
La méthode __del __ () est une méthode appelée destructeur en Python. Il est appelé
lorsque toutes les références à l’objet ont été supprimées, c’est-à-dire lorsqu’un objet
est nettoyé.
Syntaxe:
def __del__(self):
# actions
Exemple:
class Personne:
def __init__(self,nomIn,ageIn):
self.nom=nomIn
self.age=ageIn
def __del__(self):
print("je suis le destructeur")
p1=Personne("Allali",20)
print(p1.nom) #Allali
del p1 #je suis le destructeur
print(p1.nom) #NameError: name 'p1' is not defined
Déclarer une classe
9. Exercice d’application:
Réaliser une classe Point permettant de manipuler un point d'un plan. On prévoira :
3. une fonction membre déplace effectuant une translation définie par ses deux
arguments dx et dy.
du point.
Déclarer une classe
10. Principe d’encapsulation:
L'encapsulation consiste à masquer des données de l'état interne pour protéger
l'intégrité de l'objet.
Un membre d'une classe désigne un attribut ou une méthode définie dans cette classe.
La visibilité des membres d'une classe définit les endroits d'où ils peuvent être utilisés.
Dans cette partie du cours, nous allons voir deux sortes de visibilité: la
visibilité publique et la visibilité privée.
Les membres privés d'une classe ne sont accessibles que par les méthodes de la classe:
Les attributs privés d'une classe ne peuvent être utilisés que par les méthodes de
cette classe.
Les méthodes privées d'une classe ne peuvent être appelées que par les méthodes
de cette classe.
Les membres publics d'une classe sont accessibles de l'intérieur et de l'extérieur de la
classe, par conséquent:
Les attributs publiques d'une classe sont donc accessibles (en lecture ou en
écriture) depuis n'importe quelle méthode.
Les méthodes publiques d'une classe peuvent être appelées par n'importe quelle
méthode.
Déclarer une classe
10. Principe d’encapsulation:
En Python, il n’existe pas de mécanisme dans le langage qui nous permettrait de gérer
la visibilité. Par contre, il existe une convention dans le nommage.
Une méthode ou un attribut dont le nom commence par __ (underscore) est considéré
comme privé. Il est donc déconseillé d’accéder à un tel attribut ou d’appeler une telle
méthode depuis l’extérieur de l’objet.
Les attributs privés d'une classe ne peuvent être utilisés que par les méthodes de cette
classe. Les méthodes privées d'une classe ne peuvent être appelées que par les
méthodes de cette classe.
Exemple:
class Personne:
def __init__(self,nom):
self.nom=nom
self.__age=20
p1=Personne("Allali")
print(p1.__age) #AttributeError: 'Personne' object has no attribute '__age'
Déclarer une classe
10. les accesseurs et mutateurs:
L'encapsulation d'une classe interdit d'accéder à ses attributs depuis l'extérieur, mais
elle autorise d'y accéder indirectement via des méthodes. Les méthodes jouant ce rôle
sont appelées des accesseurs et les mutateurs.
les accesseurs (en anglais accessor) qui fournissent des informations relatives à
l’état d’un objet, c’est-à-dire aux valeurs de certains de ses attributs (généralement
privés) sans les modifier ;
les mutateurs (en anglais mutator) qui modifient l’état d’un objet, donc les valeurs
de certains de ses attributs.
On rencontre souvent l’utilisation de noms de la forme get_XXXX() pour les
accesseurs et set_XXXX() pour les mutateurs, y compris dans des programmes dans
lesquels les noms de variable sont francisés.
Déclarer une classe
10. les accesseurs et mutateurs:
Exemple:
class Personne:
def __init__(self,nomA,prenomA):
self.__nom=nomA
self.__prenom=prenomA
def getNom(self):
return self.__nom
def setNom(self,nom):
self.__nom=nom
def getPrenom(self):
return self.__prenom
def setPrenom(self,prenom):
self.__prenom=prenom
p=Personne("allali","ahmed")
print(p.__nom) #AttributeError: 'Personne' object has no attribute '__nom'
print(p.getNom()) #allali
p.setNom("kadiri")
print(p.getNom())#Kadiri
Attributs et méthodes statiques
Les variables statiques sont les variables dont la valeur est définie au niveau
de la classe. Il n’est pas nécessaire d’avoir une instance de classe pour
accéder aux variables statiques.
Ces attributs sont partagés par toutes les instances.
Attributs et méthodes statiques
1. Attributs statiques
Syntaxe:
class Nom_class :
attribut_statique = valeur
def nom_methode (self,params, ...):
Nom_class.attribut_statique2 = valeur2
Utilisation
p1=Personne("allali",20)
p2=Personne("kadiri",19)
p3=Personne("Mrabti",20)
print(Personne.nombreObjets) #3
Attributs et méthodes statiques
2. Méthodes statiques
Une méthode de classe ou une méthode statique est une méthode qui n'agit pas sur
des variables d'instance mais uniquement sur des variables de classe.
On déclare une méthode statique d’une classe :
en préfixant la déclaration du décorateur @staticmethod.
elle peut être appelée même sans avoir instancié la classe
elle peut accéder uniquement à des variables et méthodes statiques
elle peut être appelée avec la notation classe.methode() au lieu de
objet.methode()
Les méthodes statiques sont utiles lors de la création de méthodes utilitaires qui
effectuent une tâche de manière isolée car elles n’ont pas besoin d’accéder ou de
modifier les propriétés d’une classe ; cela ne fonctionne qu’avec les données
passées dans les arguments.
Attributs et méthodes statiques
2. Méthodes statiques
Une méthode de classe ou une méthode statique est une méthode qui n'agit pas sur
des variables d'instance mais uniquement sur des variables de classe.
On déclare une méthode statique d’une classe :
en préfixant la déclaration du décorateur @staticmethod.
elle peut être appelée même sans avoir instancié la classe
elle peut accéder uniquement à des variables et méthodes statiques
elle peut être appelée avec la notation classe.methode() au lieu de
objet.methode()
Les méthodes statiques sont utiles lors de la création de méthodes utilitaires qui
effectuent une tâche de manière isolée car elles n’ont pas besoin d’accéder ou de
modifier les propriétés d’une classe ; cela ne fonctionne qu’avec les données
passées dans les arguments.
Attributs et méthodes statiques
2. Méthodes statiques
Syntaxe:
class Nom_Class:
@staticmethod
def methodeStatique():
#traitement
Utilisation: Nom_Class.methodeStatique()
Attributs et méthodes statiques
2. Méthodes statiques
Exemple:
class Personne:
nombreObjets=0
def __init__(self,nom,age):
self.nom=nom
self.age=age
Personne.nombreObjets+=1
@staticmethod
def affichage():
print(Personne.nombreObjets)
@staticmethod
def affichageInfo(p):
print(p.nom,p.age)
Utilisation:
p1=Personne("allali",20)
p2=Personne("Mrabti",19)
Personne.affichage() #2
Personne.affichageInfo(p1) #allali 20
Attributs et méthodes statiques
3. Exercice d’application
Réaliser une classe Vecteur3d permettant de manipuler des vecteurs à trois
composantes et disposant :
1. Un attribut partagé qui permet de compter le nombre d’instances
2. d’un constructeur à trois arguments,
3. d’une méthode d’affichage des coordonnées du vecteur, sous la forme : <
composante_1, composante_2, composante_3 >
4. d’une méthode fournissant la norme d’un vecteur,
5. d’une méthode (statique) fournissant la somme de deux vecteurs,
6. d’une méthode (non statique) fournissant le produit scalaire de deux
vecteurs.
7. Écrire un petit programme utilisant cette classe.