Académique Documents
Professionnel Documents
Culture Documents
Cours :
PROGRAMMATION
PYTHON
Chargé de cours:
Dr. ATTA Amanvon Ferdinand
Université Polytechnique de Bingerville
Année académique 2023-2024
Note
Ce document est un ensemble de notes de cours du chapitre 1 du cours intitulé Pro-
grammation Python délivré par Dr. ATTA Amanvon Ferdinand en Licence 2/3EA. S’il
vous plaît, envoyez vos commentaires et/ou corrections à ferdinand.atta@outlook.fr.
1
TABLE DES MATIÈRES Programmation procédurale en Python
Objectifs 4
1 Introduction 5
2 Caractéristiques de Python 5
7 Modularité 18
7.1 Fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
7.1.1 Écriture de fonction . . . . . . . . . . . . . . . . . . . . . . . . . . 18
7.1.2 Quelques fonctions particulières . . . . . . . . . . . . . . . . . . . 19
7.2 Module et package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
8 Fichier 21
9 Exercices d’application 23
9.1 Enoncé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
9.2 Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
10 Travaux dirigés 24
11 Conclusion 24
Pré-requis
— Les notions de base en algorithmique
Objectifs
— Apprendre les notions de base de Python
— Apprendre à manipuler les structures de données Python
— Se familiariser avec les concepts de module et package
— Apprendre à manipuler les fichiers en Python
1 Introduction
L’automatisation de la résolution d’un problème en informatique fait appel à deux éléments
clés :
1. Algorithme : Un algorithme est une suite finie et non ambiguë d’étapes permettant
de résoudre un problème ou d’obtenir un résultat. On attend d’un algorithme qu’il se
termine en un temps raisonnable, qu’il soit pertinent et efficace.
2. Programme : Un programme est une traduction d’un algorithme en un langage (tel
que le langage Python) compilable ou interprétable par un ordinateur. Il est souvent
écrit en plusieurs parties dont une qui pilote les autres : le programme principal.
La programmation désigne l’ensemble des activités qui permettent l’écriture des programmes.
Le génie logiciel étudie les méthodes de construction des programmes. Plusieurs para-
digmes (ou modèles) de programmation sont envisageables, entre autres :
— La programmation procédurale. On emploie l’analyse descendante (division des pro-
blèmes) et remontante (réutilisation d’un maximum de sous-algorithmes). On s’ef-
force ainsi de décomposer un problème complexe en sous-programmes plus simples.
Ce modèle structure d’abord les actions ;
— La programmation orienté objet. Centrée sur les données, elle est considérée plus
stable dans le temps et meilleure dans sa conception. On conçoit des fabriques (classes),
qui servent à produire des composants (objets), qui contiennent des données (attri-
buts) et des actions (méthodes). Les classes dérivent (héritage) de classes de base dans
une construction hiérarchique.
Python offre ces deux paradigmes, que l’on peut mélanger suivant les besoins et suivant ce
qui apparaît comme le plus adapté au problème à résoudre. Il arrive parfois qu’on construise
une solution sous forme procédurale pour ensuite la restructurer partiellement sous une
forme objet plus pérenne et plus réutilisable.
Ainsi, dans cette leçon 1, nous introduisons les bases du langage Python en se focalisant sur
le paradigme procédurale. L’étude du second paradigme en Python sera l’objet de la leçon
2.
2 Caractéristiques de Python
Les langages qui s’imposent sont ceux qui ont su se diversifier et permettre de répondre de
manière pertinente et efficace à une multiplicité de domaines d’application. Python entre
exactement dans ce cadre. Python a été crée par Guido Van Rossum. La première version
de Python a été divulguée en 1991, donc Python a fêté ses 30 ans en 2021 ! A l’automne
2023, nous avons assité à la naissance de la version 3.12 1 de Python.
le langage Python a plusieurs poins forts entre autres :
1. https://www.docstring.fr/blog/les-nouveautes-de-python312/
— Simplicité : Python est très facile à apprendre. Ses programmes sont clairement défi-
nis et facilement lisibles. Il utilise peu de mots-clés et une syntaxe clairement définie.
Cela permet à n’importe qui de se familiariser rapidement avec ce langage.
— Open Source : Par conséquent, tout le monde peut utiliser librement le code pour
écrire de nouveaux programmes.
— Langage de programmation de haut niveau : Les programmeurs n’ont qu’à s’oc-
cuper de la solution du problème ; ils n’ont pas à penser aux détails de bas niveau.
— Indépendance de la plate-forme : La machine virtuelle Python convertit le code en
une forme compréhensible par la machine une fois écrit, il est donc indépendant de
la plate-forme.
— Typage dynamique : Python est considéré comme un langage dynamiquement typé,
car il n’est pas nécessaire de déclarer le type de données de la variable utilisée. Il
prend automatiquement son type de données alors qu’en Java, C, etc. les types de
données doivent être déclarés car ce sont des langages à typage statique.
— Procédural et orienté objet : Python permet un style de programmation orienté objet
et orienté procédure. Alors que la technique orientée objet encapsule les données et les
fonctionnalités dans des objets, la technique orientée procédure, quant à elle, construit
le programme autour de procédures ou de fonctions qui ne sont rien d’autre que des
morceaux de programmes réutilisables.
— Interprété : Il n’est pas nécessaire de compiler un programme avant de l’exécuter
car il est compilé au moment de l’exécution uniquement. Vous pouvez simplement
exécuter le programme (Jenkins 2004).
— Extensible : Python étant Open Source, n’importe qui peut y ajouter des modules.
Ces modules permettent aux programmeurs d’ajouter ou de personnaliser leurs outils
pour travailler plus efficacement.
— Vaste bibliothèque : Python fournit une riche bibliothèque intégrée, qui peut être
utilisée directement par le programmeur.
4.2 Opérateurs
4.2.1 Opérateurs arithmétiques
1 add = 10 + 5 # Addition
2 soust = 10 - 5 # Soustraction
3 divise = 10 / 5 # Division
4 multipli = 10 * 5 # Multiplication
5 print(add, soust, divise, multipli)
6 puissance = 10 ** 5 # Puissance
7 # Modulo : Retourne le reste de la division
8 modulo = 10 % 5
9 # Division 'Floor'
10 # Arrondi le resultat de la division
11 # meme si les deux nombre sont des float
12 division_normale = 11.0 / 5.0 #le resultat est 2.2
13 division_floor = 11.0 // 5.0 #le resultat est 2
1 age = 15
2 age += 15 # Equivaut à: age = age + 15
3 print(age) #affiche 30
Par exemple :
Finsi
Devient en Python :
Syntaxe conditionnelle composée
if<condition>:
<séquence1>
else:
<séquence2>
Par exemple :
Par exemple :
Par exemple :
N.B : L’alternative n’est possible qu’avec une version de Python au moins égale à
3.10
Syntaxe POUR
for <indice> in <itérateur>:
<séquenceInstructions>
Par exemple :
N.B : Une instruction break peut être utilisée à une itération donnée pour sortir d’une
structure répétitive
<nom_liste> =[suite_elements_separés_par_virgule]
13 #comprehenson de liste :
14 autre_liste1 = [1, 2, 3, 4, 5]
15 autre_liste2 = [i*2 for i in autre_liste1]
16 autre_liste3 = [i*2 for i in autre_liste1 if i >= 3]
17 autre_liste4 = [i**2 if i >= 3 else i*2 for i in autre_liste1]
6.2 Tuple
Un tuple est une séquence d’éléments quelconques, ordonnées qui est immutable.
Syntaxe Tuple
<nom_tuple> =(suite_elements_separés_par_virgule)
6.3 Ensemble
Un ensemble ou set est un ensemble d’élements non redondant et qui est immutable où
l’on peut savoir si un élément est présent sans avoir à parcourir tous l’ensemble.
Syntaxe set
<nom_set> = set(<iterable>)
ou
<nom_set> = {elt1,...,eltn}
1 # Création de Sets
2 e1 = {1, 2}, e2 = {2, 3}
3 e3 = e1.union(e2) #Union d'ensembles
4 e4 = e1.intersection(e2) #Intersection d'ensembles
5 e5 = e1.difference(e2) #Différence d'ensembles
6 e6 = {2}
7 print(e6.issubset(e1)) #test d'inclusion
8 print(e1.issuperset(e6)) #test de super-ensemble
6.4 Dictionnaire
Un dictionnaire est une sorte de tableau associatif ou ensembles de couples (clé,valeur) ou
items où les clés sont immutable et les valeurs sont mutables.
Syntaxe dictionnaire
<nom_dico> = dict()
ou
<nom_dico> = {"cle_1": valeur_1, ... "cle_N": valeur_N}
7 Modularité
7.1 Fonction
7.1.1 Écriture de fonction
Une fonction est une portion de code (sorte de sous-programme) que l’on peut appeler au
besoin. L’utilisation des fonctions permet :
— d’éviter la répétition
— de mettre en relief les données et les résultats : entrées et sorties de la fonction
— la réutilisation dans d’autres scripts par l’intermédiaire du mécanisme de l’import
— de décomposer une tâche complexe en tâches plus simples.
On obtient ainsi des programmes plus courts et plus lisibles.
1 # Syntaxe
2 def nom_de_la_fonction(<parametres_formels_eventuels>):
3 code_fonction
4 # Appel de la fonction
5 nom_de_la_fonction(<parametres_effectifs_eventuels>)
6 # Fonction sans paramètre et renvoie rien
7 def affiche_paragraphe():
On peut avoir de déclarer des fonctions avec un nombre de paramètres ou arguments va-
riables. Pour ce faire :
— On passe les paramètres depuis ou vers des conteneurs
— l’opérateur * convertit des arguments non nommés en tuple
— l’opérateur ** convertit des arguments nommés en dictionnaire
1 # Utilisation de l’opérateur *
2 def test_var_args(farg, *args):
3 print('formel arg:', farg)
4 for arg in args :
5 print('autre arg:', arg)
6 test_var_args(1,'two', 3)
7 # Utilisation de l’opérateur **
8 def test_var_kwargs(farg, **kwargs):
9 print ("formel arg:", farg)
10 for key in kwargs :
11 print('autre clé arg: {}:{}'.format(key,kwargs[key]))
12 test_var_kwargs(farg=1,myarg2='two', myarg3=3)
6 # 1 lundi
7 # 2 mardi
8 # 3 mercredi
9 # 4 jeudi
10 # 5 vendredi
11 # 6 samedi
12 # 7 dimanche
— map() : Produit un itérateur qui accepte une fonction pour produire une nouvelle
valeur à partir de la valeur obtenue par l’itérateur passé en second paramètre :
5 # Affiche
6 # LUNDI
7 # MARDI
8 # MERCREDI
9 # JEUDI
10 # VENDREDI
11 # SAMEDI
12 # DIMANCHE
— filter() : Produit un itérateur qui retourne la valeur de l’itérateur passé en second paramètre que si la fonction passée en premier
paramètre retourne True pour cette valeur.
6 # Affiche
7 # mardi
8 # mercredi
— zip() : Produit un itérateur qui produit un tuple regroupant les valeurs de chacun des itérateurs (listes, tuple, etc.) passés en
paramètre. L’itération s’arrête lorsque l’un des itérateurs se termine.
1 def carre(valeur):
2 resultat = valeur**2
3 return resultat
4 def cube(valeur):
5 resultat = valeur**3
6 return resultat
8 Fichier
— Ouverture et fermeture de fichier texte :
9 # Autre modes
10 #f = open(chemin, mode = "a" encodage= "utf8") # Ouverture pour ajout
11 #f = open(chemin, mode = "w" encodage= "utf8") # Ouverture pour écriture
12 # Ce dernier écrase le contenu si existant
13 #Méthode 2
14 with open(chemin) as f:
15 # faire des opérations sur le contenu du fichier
16 pass
1 chemin = 'file.txt'
2 #Methode1 : sans with
3 #mode="w" écrit en écrasant le contenu exisant
4 # à sa suite
5 f = open(chemin, 'w', encoding="utf8")
6 f.write('Contenu1 ajouté \n') # ou f.writelines(liste_de_lignes)
7 f.writelines(['Contenu2 ajouté\n', 'Contenu3 ajouté\n'])
8
9 f.close()
10 #Methode2 : avec with
11 #Pour écrire dans un fichier et rajouter du contenu
12 with open(chemin, mode='a', encoding='utf8') as f:
13 f.write('Contenu4 ajouté\n')
14
15
1 chemin = 'file.txt'
2 f = open(chemin, 'r', encoding="utf8")
3 #Méthode1:
4 # Récupérer le contenu complet du fichier dans
5 #une chaine de caractere avec f.read()
6
8 #Méthode2:
9 #contenu du fichier sous la forme d’un tableau de chaînes
10 #de caractères (un élément par ligne)
11 lignes = f.readlines()
12 for ligne in lignes:
13 print(ligne.rstrip('\n'))# supprimer caractère de fin de ligne
14 f.close()
15 #Possibilité d'utiliser with comme pour lecture
16 with open(chemin, mode='r', encoding='utf8') as f:
17 for l in f:
18 print(l.rstrip('\n'))
9 Exercices d’application
9.1 Enoncé
1. Lequel des éléments suivants est utilisé pour initialiser plusieurs variables avec une
valeur commune ?
a) x = y : y = 33 b) x = y = z = 33
c) x = z ; y = z ; x = 33 ; d) x & y & z = 33
2. Qu’est ce qui s’affiche après exécution du code précédent si on remplace la dernière
instruction par ?
b = 1
for a in range(1,6):
b = b+a
print(b)
a) 20 b) 16 c) 17 d) 15
3. Quelle sera la sortie après les déclarations suivantes ?
x = [25, 35, 45]
y = x[1]
print(y)
a) x1 b) 25 c) 45 d) 35
4. Quelle est la bonne méthode pour charger un module ?
a) Using math b) #include math.h c) import math d) include math
9.2 Solution
1.b) 2.b) 3.d) 4.c)
10 Travaux dirigés
Voir fiche d’exercices n°1.
11 Conclusion
— Python est un langage simple, généraliste, très puissant et beaucoup utilisé aujour-
d’hui dans les domaines tels que l’IA, l’automatisation de taches (administration sys-
tème, réseau).
— La programmation procédure est implémenté par Python (voir Figure 2)
— Pour allez plus loin 2 :
— Fonction anonyme, fonction génératrice, décorateur
— Structure de données avancées : namedtuple, defaultdict, dataclass,
Counter
— Traitement de fichier csv, xlsx, etc.
Références
[1] Vijay Kumar Sharma, Vimal Kumar, Swati Sharma, and Shashwat Pathak. Python Pro-
gramming. Chapman and Hall/CRC, jul 2021.
[2] Bob Cordeau and Laurent Pointal. Python 3-2e éd. : Apprendre à programmer dans
l’écosystème Python. Dunod, 2020.
[3] Gérard Swinnen. Apprendre à programmer avec Python 3. Editions Eyrolles, 2012.
[4] Sébastien Chazallet. Python 3 Les fondamentaux du langage. ENI, 2019.
[5] https://gayerie.dev/docs/python/index.html
Chargé de cours:
Dr. ATTA Amanvon Ferdinand
Université Polytechnique de Bingerville
Année académique 2023-2024
Note
Ce document est un ensemble de notes de cours du chapitre 2 du cours intitulé Pro-
grammation Python délivré par Dr. ATTA Amanvon Ferdinand en Licence 2/3EA. S’il
vous plaît, envoyez vos commentaires et/ou corrections à ferdinand.atta@outlook.fr.
1
TABLE DES MATIÈRES POO en Python
Objectifs 3
1 Introduction 4
2 Objet et classe 4
2.1 Objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 Classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2.1 Définition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2.2 Attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2.3 Méthodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3 Principes de la POO 8
3.1 Encapsulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.1.1 Définition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.1.2 Membres privés, Mutateur & Accesseur . . . . . . . . . . . . . . . 9
3.1.3 Exemples d’implémentations de l’encapsulation . . . . . . . . . . . 9
3.2 Héritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2.1 Définition de l’héritage . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2.2 Exemple d’implémentation de l’héritage . . . . . . . . . . . . . . . 11
3.3 Polymorphisme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.3.1 Définition du polymorphisme . . . . . . . . . . . . . . . . . . . . 12
3.3.2 Exemple d’implémentation du polymorphisme . . . . . . . . . . . 12
5 Exceptions 14
5.1 Définition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
5.2 Gestion des exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
5.2.1 Levée d’exception . . . . . . . . . . . . . . . . . . . . . . . . . . 15
5.2.2 Capture des exceptions . . . . . . . . . . . . . . . . . . . . . . . . 15
6 Conclusion 17
Pré-requis
— Les notions de programmation procédurale en Python
Objectifs
— Introduire les concepts de la POO
— Présenter l’implémentation des concepts de la POO en python
— Apprendre à traiter les exceptions
1 Introduction
La Programmation Orientée Objet (POO) est un paradigme de programmation basé sur
le concept d’"objets", qui peuvent contenir des données et du code : des données sous la
forme de champs (souvent appelés attributs ou propriétés) et du code, sous la forme de
procédures (souvent appelées méthodes). La POO utilise des objets et des classes dans la
programmation, qui vise à mettre en œuvre des entités du monde réel comme l’héritage, le
polymorphisme, l’encapsulation, etc. L’idée principale de la POO est de lier les données
et les fonctions qui fonctionnent ensemble comme une seule unité. Il s’agit d’un paradigme
de programmation largement utilisé pour écrire des applications puissantes. Il modélise
des choses complexes sous forme de structures simples et reproductibles, ce qui permet la
réutilisation du code, l’évolutivité et l’efficacité.
Dans cette leçon, nous allons apprendre tous les concepts fondamentaux de la POO en Py-
thon. Nous commencerons par les bases de la POO, puis nous apprendrons l’héritage, l’en-
capsulation et le polymorphisme. Par ailleurs, nous introduirons la gestion des exceptions :
phénomène basée sur la POO.
2 Objet et classe
2.1 Objet
— L’objet est unité cohérente possédant :
— une identité
— un état, défini par des données (attributs, ou données membres)
— un comportement, défini par des fonctions (méthodes, ou fonctions membres).
— Un objet peut représenter :
— un objet concret du monde réel, ayant une réalité physique : une personne, une
voiture, un outil, un système mécanique. . .
2.2 Classe
2.2.1 Définition
— Le concept de classe désigne un modèle représentant une famille d’objets partageant :
— La même structure de données (c.à.d. même liste d’attributs)
— Les mêmes méthodes
— La classe par elle-même ne contient pas les valeurs des données : c’est un modèle
qui décrit la structure des données. Chaque objet (instance d’une classe) donne des
valeurs aux attributs de la classe.
— création en python : on utilise le mot clé class avec pour constructeur __init__ .
Lorsque nous créons un objet à partir d’une classe, la première méthode qui est appe-
lée est la méthode __init__(). Elle est connue sous le nom de méthode "constructeur"
ou plus simplement constructeur. En d’autres termes, __init__() crée une instance
de la classe. En Python, chaque classe possède une méthode __init__(). Que vous la
définissiez explicitement ou qu’elle soit définie implicitement par Python, elle existe
dans chaque classe. Le premier paramètre de la méthode __init__() sera toujours self
(comme toutes les autres méthodes d’une classe). Après cela, vous pouvez déclarer
tous les arguments que vous voulez que votre classe accepte.
1 class Humain:
2 def __init__(self):
3 pass
2.2.2 Attributs
Un attribut d’instance est un attribut dont la valeur peut être différente pour chaque ins-
tance de la classe. En clair, la valeur d’un attribut A pour un objet1 n’est pas forcément
égale à la valeur de l’attribut A pour un objet2 : objet1 et objet2 étant des instances de la
même classe. Par exemple, dans la classe Humain ci-dessous, l’attribut nom est un attribut
d’instance.
1 class Humain:
2 def __init__(self, nom):
3 self.nom = nom #nom est un attribut instance
4 #humain avec pour attribut instance nom = "ATTA"
5 humain1 = Humain("ATTA")
Un attribut de classe est un attribut dont la valeur est la même pour chaque instance de la
classe, c’est-à-dire pour chaque objet créé à partir de cette classe. Pour définir un attribut
au sein d’une classe, il suffit d’assigner une valeur à cet attribut dans le corps de la classe.
Par exemple, dans la classe Humain ci-dessous, l’attribut lieu_habitation est un attribut de
classe.
1 class Humain:
2 lieu_habitation = "Terre" #nom est un attribut de classe
3 def __init__(self, nom):
4 self.nom = nom #nom est un attribut instance
5 humain1 = Humain("ATTA")
6 humain2 = Humain("ANOH")
7 print(humain1.lieu_habitation)
8 print(humain2.lieu_habitation)
9 print(Humain.lieu_habitation)
2.2.3 Méthodes
Une méthode d’instance est une méthode applicable que sur un objet. En clair, on ne
peut faire appel à une méthode d’instance qu’en passant par un objet (c’est-à-dire ob-
jetA.methode_instance()).
N.B : Une méthode d’instance doit avoir impérativement comme premier attribut self.
1 class Humain:
2 lieu_habitation = "Terre" #nom est un attribut de classe
3 def __init__(self, nom):
4 self.nom = nom #nom est un attribut instance
5 def parler(self, message): #Methode d’instance
6 print("{} a dit {}".format(self.nom, message))
7 humain = Humain("ATTA")
8 message = "bon apprentissage de la POO"
9 humain.parler(message)
Une méthode de classe est une méthode qui peut s’exécuter sans instancier la classe (pas
de création d’objet). Elle doit absolument avoir comme premier paramètre le mot clé cls.
1 class Humain:
2 lieu_habitation = "Terre" #nom est un attribut de classe
3 def __init__(self, nom):
4 self.nom = nom #nom est un attribut instance
5 def parler(self, message): #Methode d’instance
6 print("{} a dit {}".format(self.nom, message))
7 #Methode de classe
8 def changer_planete(cls, nouvelle_planete):
9 Humain.lieu_habitation = nouvelle_planete
10 changer_planete = classmethod(changer_planete)
11 print("Planète actuelle: {}".format(Humain.lieu_habitation))
12 Humain.changer_planete("Mars")
13 print("Planete actuelle: {}".format(Humain.lieu_habitation))
Une méthode statique est très similaire à une méthode de classe, mais la différence est que
nous n’avons pas besoin d’utiliser le mot-clé ’cls’. Une méthode statique n’a pas accès à
l’état de la classe et ne peut donc pas la modifier. Alors pourquoi avons-nous besoin d’une
méthode statique ? Eh bien, une méthode statique peut être utilisée comme une méthode de
type utilitaire qui peut prendre des paramètres et effectuer certaines actions.
1 class Humain:
2 lieu_habitation = "Terre" #nom est un attribut de classe
3 def __init__(self, nom):
4 self.nom = nom #nom est un attribut instance
5 def parler(self, message): #Methode d’instance
6 print("{} a dit {}".format(self.nom, message))
7 def changer_planete(cls, nouvelle_planete):
8 Humain.lieu_habitation = nouvelle_planete
9 changer_planete = classmethod(changer_planete)
10 def definition():#Methode statique
11 print("L’humain est le plus haut être vivant de l’univers")
12 definition = staticmethod(definition)
13 Humain.definition()
1 class Humain:
2 lieu_habitation = "Terre" #nom est un attribut de classe
3 def __init__(self, nom = ""):
4 self.nom = nom #nom est un attribut instance
5 def parler(self, message): #Methode d’instance
6 print("{} a dit {}".format(self.nom, message))
7 def changer_planete(cls, nouvelle_planete):
8 Humain.lieu_habitation = nouvelle_planete
9 changer_planete = classmethod(changer_planete)
10 def definition():
11 print("L’humain est classé comme le plus haut être\
12 vivant de l’univers")
13 definition = staticmethod(definition)
14 def __str__(self):
15 return "L’humain {}".format(self.nom)
16 humain = Humain("ATTA")
17 print(humain)
3 Principes de la POO
3.1 Encapsulation
3.1.1 Définition
Dans certaines situations, nous pouvons souhaiter que personne n’accède aux attributs (ou
données) de notre classe. Nous pouvons vouloir contrôler l’accès. Cela se fait via l’encap-
sulation. Dans la terminologie de la POO, l’encapsulation est le regroupement des attributs
et des méthodes dans un seul objet. En faisant cela, nous pouvons cacher l’état interne de
l’objet de l’extérieur. L’encapsulation fournit un masquage de l’information :
— Les données de l’objet sont encapsulées dans l’objet
— Ne pas dévoiler les détails d’implémentation en dehors de l’objet
— Pas d’accès direct aux variables d’instance, et à certaine(s) méthode(s)
— Pas recommandé d’accéder directement aux variables d’instance
1 class compte:
2 """gestion d'un compte bancaire"""
3 def __init__(self,nom,numero,valeur):
4 self.nom = nom
5 self.numero = numero
6 self.setSolde(valeur)
7 def getSolde(self): #Accesseur
8 return self.__solde #variable privee
9 def setSolde(self,x): #Mutateur
10 if x>=0:
11 self.__solde += x
12 elif abs(x)>= 50000:
13 self.__solde = -50000
14 print("Compte suspendu")
15 monCompte = compte("ATTA",777,10000)
16 monCompte.setSolde(-50000)
17 print(monCompte.getSolde())
1 class compte:
2 def __init__(self,nom,numero,valeur):
3 self.nom = nom
4 self.numero = numero
5 self.solde = valeur
6 @property
7 def solde(self): #Accesseur
8 return self.__solde #variable privée
9 @solde.setter
1 class compte:
2 def __init__(self,nom,numero,valeur):
3 self.nom = nom
4 self.numero = numero
5 self.setSolde(valeur)
6 def getSolde(self): #Accesseur
7 return self.__solde #variable privee
8 def setSolde(self,x): #Mutateur
9 if x>=0:
10 self.__solde += x
11 elif abs(x)>= 50000:
12 print("Compte suspendu")
13 solde = property(getSolde,setSolde) #property
14 monCompte = compte("ATTA",777,10000)
15 monCompte.solde = -50000
16 print(monCompte.solde)
1 class compte:
2 def __init__(self,nom,numero,valeur):
3 self.nom = nom
4 self.numero = numero
5 self.__setSolde(valeur)
6 def __getSolde(self): #Methode privee
7 return self.__solde #variable privee
8 def __setSolde(self,x): #Methode privee
9 if x>=0:
10 self.__solde += x
11 elif abs(x)>= 50000:
12 print("Compte suspendu")
13 solde = property(__getSolde,__setSolde)
14 monCompte = compte("ATTA",777,10000)
15 monCompte.solde = -50000
16 print(monCompte.solde)
3.2 Héritage
3.2.1 Définition de l’héritage
L’héritage est une relation de spécialisation/généralisation entre deux classes. Elle indique
qu’une classe dite classe fille (ou classe dérivée ou sous-classe) spécialise une autre classe
dite classe mère (ou classe de base, ou classe parente, ou super classe), i.e. qu’elle possède
les attributs et les méthodes de la classe mère plus d’autres qui lui sont propres. Il existe
deux principaux types d’héritage :
1. L’héritage simple : toute classe fille n’avait qu’une seule classe de base (ou classe
mère) ;
2. L’héritage multiple : toute classe fille peut avoir au moins deux classes de base : la
classe fille peut hériter de toutes les propriétés (ou attributs) et méthodes de plusieurs
classes. méthodes de plusieurs classes.
1 class classeMere1:
2 def __init__(self):
3 pass
4 class classeMere2:
5 def __init__(self,param2):
6 , self.param2 = param2
7 class classeFille1(classeMere1): #Heritage simple
8 def __init__(self,paramf1):
9 classeMere1.__init__(self) #ou: super().__init__(self)
10 self.paramf1 = paramf1
11 class classeFille2(classeMere1, classeMere2):#Heritage multiple
12 def __init__(self, param2,paramf2):
13 classeMere1.__init__(self)
14 classeMere2.__init__(self,param2)
15 self.paramf2 = paramf2
3.3 Polymorphisme
3.3.1 Définition du polymorphisme
Le polymorphisme est le mécanisme qui permet à une classe fille de redéfinir une méthode
dont elle a hérité de sa classe mère, tout en gardant la même signature(nom et liste de para-
mètres en python).
L’intérêt majeur est d’adapter le traitement qu’effectue la méthode aux spécificités de la
classe fille. Et ce sous un même nom ce qui permet d’avoir des codes génériques.
En Python il n’y a aucune difficulté à mettre en oeuvre le polymorphisme, il suffit juste
d’implémenter la méthode en question dans la classe mère et la classe fille. Le choix de
la "bonne" méthode à utiliser se fera alors automatiquement selon la nature de l’objet, i.e.
selon qu’il appartienne à la classe mère ou à la classe fille.
1 class rectangle:
2 def __init__(self,x,y):
3 self.x = x
4 self.y = y
5 def surface(self):
6 print("methode fille")
7 return self.x * self.y
8 class paveDroit(rectangle):
9 def __init__(self,x,y,z):
10 super().__init__(x,y)
11 self.z = z
12 def surface(self):
13 print("methode fille")
14 return 2*(self.x *self.y+self.x*self.z+self.y*self.z)
15 photo = rectangle(3,4)
16 print(photo.surface())
17 weston = paveDroit(3,4,10)
18 print(weston.surface())
En Python, le module abc permet de simuler ce type d’approche. Le nom de ce module est
la contraction de abstract base classes. Ce module fournit une méta-classe appelée ABC-
Meta qui permet de transformer une classe Python en classe abstraite. Ce module fournit
également le décorateur @abstractmethod qui permet de déclarer comme abstraite une
méthode, une méthode statique, une méthode de classe ou une propriété. Cela signifie qu’il
n’est pas possible de créer une instance d’une classe qui hérite d’une classe abstraite tant
que toutes les méthodes abstraites ne sont pas implémentées.
3 class Animal(metaclass=ABCMeta):
4 @abstractmethod
5 def crier(self):
6 pass
4 class Chien(Animal):
5 def crier(self):
6 print("whouaf whouaf !")
7
8 c = Chien()
9 c.crier()
— La classe Animal est en quelque sorte devenu un contrat qui indique que toute classe
qui en hérite doit fournir une implémentation pour la méthode crier().
5 Exceptions
5.1 Définition
Il arrive que lors de l’exécution d’un programme Python, le programme ne s’exécute pas du
tout ou le programme s’exécute mais génère une sortie inattendue ou se comporte anorma-
lement. Cela se produit lorsqu’il y a des erreurs de syntaxe, d’exécution ou de logique dans
le code.
Les exceptions 1 font partie d’un mécanisme de gestion des erreurs en Python. Elles per-
mettent de baliser les étapes d’un programme pour faire face à des situations pour lesquelles
celui-ci n’a pas été prévu. L’exception permet de définir le type d’erreur rencontrée et de
donner des indications à l’utilisateur quant à la nature de cette erreur. Même si une instruc-
tion ou une expression est syntaxiquement correcte, une erreur peut survenir pendant son
exécution. Par exemple, essayer d’ouvrir un fichier qui n’existe pas, une division par zéro,
etc.
1. Voir la sémantique des exceptions natives en Python: https://docs.python.org/fr/3/library/exceptions.html
Figure 2 – Exemple
Des exceptions sont automatiquement levées par les fonctions built-in de python. Cependant,
il est possible de lever ses propres exception à l’aide du mot-clé raise.
Exemple :
6 Conclusion
La Programmation Orientée Objet (POO) est très utile car nous pouvons écrire un morceau
de code et réutiliser ce code en créant différentes classes et instances de ces classes. Cha-
cune de ces classes peut ajouter de nouvelles fonctionnalités sans avoir à écrire/changer ou
modifier le code existant. Les programmes complexes nécessitent l’utilisation de classes et
d’objets car nous pouvons créer plusieurs morceaux de code gérables.
La POO est basée sur les principes suivant :
— Encapsulation
— Héritage
— Le polymorphisme
Pour allez plus loin :
— Méta classe
— Personnalisation d’exception
Références
[1] Vijay Kumar Sharma, Vimal Kumar, Swati Sharma, and Shashwat Pathak. Python Pro-
gramming. Chapman and Hall/CRC, jul 2021.
[2] Bob Cordeau and Laurent Pointal. Python 3-2e éd. : Apprendre à programmer dans
l’écosystème Python. Dunod, 2020.
[3] Gérard Swinnen. Apprendre à programmer avec Python 3. Editions Eyrolles, 2012.
[4] Sébastien Chazallet. Python 3 Les fondamentaux du langage. ENI, 2019.
Annexe