Aujourd'hui, la POO reste un pilier fondamental du développement logiciel, influençant la conception de systèmes logiciels complexes et la manière dont les développeurs pensent la résolution de problèmes informatiques.
A copier dans le cahier.
Un paradigme de programmation est la façon dont un programme (ou un bout de programme) est construit.
Vous avez vu jusque là deux paradigmes de programmation : la programmation impérative et la programmation fonctionnelle.
Voici deux façons de compter le nombre de fois où la lettre "c" est présente dans 'coucou':
Programmation impérative:
x="coucou"
compteur=0
for lettre in x:
if lettre=="c":
compteur+=1
print(compteur)
Programmation fonctionnelle:
def test_est_un_c(lettre):
if lettre=="c":
return 1
else:
return 0
def test_texte(texte):
if len(texte)==0:
return 0
return test_est_un_c(texte[0])+test_texte(texte[1:])
print(test_texte("coucou"))
A copier dans le cahier.
Les lettres POO signifient Programmation Orientée Objet. C'est un troisième paradigme de programmation.
Cela désigne la possibilité dans un langage informatique à créer divers objets avec des propriétés et des méthodes associées.
Née en 1960, cette possibilité s'est démocratisée dans les années 1990.
Dans Python, pour créer des objets qui ne sont pas naturellement présent, on utilise l'instruction class
.
Celui-ci doit impérativement contenir "le constructeur" def __init__(self):
.
Une "bonne pratique" est de distinguer les mots d'un nom de classe en mettant des majuscules au début de chaque mot. Par exemple CompteBancaire
, ArbreBinaire
etc.
Lorsque l'on crée une class, on peut y ajouter des méthodes et des attributs.
class Joueur:
def __init__(self,pseudo):
self.pseudo=pseudo #ceci est un attribut
self.points_de_vie=1000 #ceci est un attribut
def change_pseudo(self,nouveau_pseudo): #ceci est une méthode
self.pseudo=nouveau_pseudo
def get_pseudo(self): #ceci est une méthode
return self.pseudo
Par exemple, dans le code ci-dessus, on peut faire appel à l'attribut joueur1.pseudo
ou encore à la méthode
joueur1.get_pseudo()
Dans cet exercice, vous allez créer une classe CompteBancaire
pour simuler la gestion d'un compte bancaire :
titulaire
et un solde
initial.CompteBancaire
."Jean Dupont"
et un solde initial de 1000
euros.250
euros, puis un retrait de 500
euros et affichez le solde après ces opérations.Tests :
Affichage :
Console:
A copier dans le cahier.
Lorsque l'on crée une classe, on peut avoir des méthodes ou des attributs privés. Ils ne sont alors pas accessibles depuis l'extérieur de la classe.
Dans Python, une méthode ou un attribut est par défaut publique mais peut être passé en privé en rajoutant __
devant.
class Joueur:
def __init__(self,nom):
self.pseudo=self.__crea_nom(nom)
self.__point_de_vie=100
def affiche_pv(self):
return self.__point_de_vie
def __crea_nom(self,mot):
if mot=="aucun":
return "Anonyme"
else:
return mot
Dans le code ci-dessus :
.pseudo
est un attribut publique..__point_de_vie
est un attribut privé..affiche_pv(self)
est une méthode publique..__crea_nom(self,nom)
est une méthode privé.Dans cet exercice, vous allez créer une classe Livre
pour gérer les informations d'une bibliothèque :
titre
et l'auteur
sont des attributs publics.annee_publication
est un attribut privé, vérifié lors de l'initialisation pour s'assurer qu'elle est inférieur ou égale à 2030.affiche_info()
doit afficher le titre, l'auteur et l'année de publication.__verifie_annee()
est utilisée pour valider l'année.Livre
.Livre
avec les informations suivantes :
affiche_info()
pour afficher les informations de chaque livre.__annee_publication
pour observer ce qui se passe.Tests :
Affichage :
Console:
On dispose d’une classe Carte
permettant de créer des objets modélisant des cartes à jouer.
Complète la classe Paquet_de_cartes
ci-dessous :
get_carte(pos)
doit renvoyer la carte à la position donnée.pos
est bien compris entre 0 et 51.⭐ Exemples :
>>> jeu = Paquet_de_cartes()
>>> carte1 = jeu.get_carte(20)
>>> print(carte1.get_valeur() + " de " + carte1.get_couleur())
8 de coeur
>>> carte2 = jeu.get_carte(0)
>>> print(carte2.get_valeur() + " de " + carte2.get_couleur())
As de pique
>>> carte3 = jeu.get_carte(52)
AssertionError: paramètre pos invalide
Tests :
Affichage :
Console:
Dans cet exercice, on appelle carré d’ordre n
un tableau de n
lignes et n
colonnes dont
chaque case contient un entier naturel.
Exemples :
1 | 7 |
7 | 1 |
c2
Un carré d'ordre 2
3 | 4 | 5 |
4 | 4 | 4 |
5 | 4 | 3 |
c3
Un carré d'ordre 3
2 | 9 | 4 |
7 | 0 | 3 |
6 | 1 | 8 |
c3bis
Un autre carré d'ordre 3
Un carré est dit semimagique lorsque les sommes des éléments situés sur chaque ligne et chaque colonne sont égales.
La classe Carre
en page suivante contient des méthodes qui permettent de manipuler des carrés :
affiche
permet d’afficher le carré créé.Exemples :
>>> liste = (3, 4, 5, 4, 4, 4, 5, 4, 3)
>>> c3 = Carre(liste, 3)
>>> c3.affiche()
[3, 4, 5]
[4, 4, 4]
[5, 4, 3]
Compléter la méthode est_semimagique
qui renvoie True
si le carré est semimagique,
False
sinon. Puis tester la fonction est_semimagique
sur les carrés c2, c3 et c3bis.
Tests :
Affichage :
Console:
A faire dans le cahier.
Pour travailler sur des dates, on a créé la classe Date dont le code est écrit ci-dessous
class Date:
def __init__(self, jour, mois, annee):
self.jour = ...
self.mois = ...
self.annee = ...
self.nb_jours_par_mois = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
def get_jour(self):
return self.jour
def get_mois(self):
return self.mois
def get_annee(self):
return ...
def set_jour(self, jour):
self.jour = jour
def set_mois(self, mois):
self.mois = ...
def set_annee(self, annee):
self.annee = annee
def est_bissextile(self):
...
Le constructeur de la classe Date
prend en paramètres trois entiers représentant le
jour, le mois et l’année, puis les affecte respectivement aux attributs jour
, mois
et
annee
.
Indiquer à quelle date correspond l’instance de la classe Date
suivante :
d = Date(1, 5, 2000)
Écrire le code permettant de créer une instance d
de la classe Date
qui représente la date du 19 juin 2024.
La méthode get_annee
renvoie la valeur de l’attribut annee
.
Recopier et compléter les lignes de la méthode get_annee
.
La méthode set_mois
modifie l’attribut mois
en lui affectant la valeur passée en argument.
Recopier et compléter les lignes de la méthode set_mois
.
L’attribut nb_jours_par_mois
contient une liste qui correspond au nombre de jours pour chaque mois.
Le mois de février contient généralement 28 jours mais lors des années bissextiles il en contient 29.
La classe Date
dispose d’une méthode est_bissextile
, qui utilise uniquement l’attribut annee
, et qui renvoie True
si l’année de l’instance courante est bissextile et False
sinon. On veut compléter la méthode __init__
pour ajuster le nombre de jours par mois pour les années bissextiles.
Recopier et compléter les lignes suivantes :
class Date:
def __init__(self, jour, mois, annee):
self.jour = ...
self.mois = ...
self.annee = ...
self.nb_jours_par_mois = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
if .... :
self.nb_jours_par_mois[...] = 29
Pour déterminer le nombre de jours au cours d’une année, il faut savoir si elle est bissextile.
Une année est bissextile si elle est divisible par 4 mais pas par 100 ou si elle est divisible par 400.
Écrire le code de la méthode est_bissextile
.
On rappelle qu’un entier a
est divisible par l’entier n
si a % n == 0
.
On dote la classe Date
de la méthode nb_jours_passes
qui renvoie le nombre de jours passés dans l’année de l’instance courante.
def nb_jours_passes(self):
nb_jours = self.jour
mois = self.mois - 2
while mois >= 0:
nb_jours = nb_jours + self.nb_jours_par_mois[mois]
mois = mois - 1
return nb_jours
Indiquer quel sera l’affichage en console après l’exécution des deux instructions suivantes :
>>> d1 = Date(20, 3, 2001)
>>> d1.nb_jours_passes()
On dote la classe Date
de la méthode nb_jours_restants
qui renvoie le nombre de jours restants dans l’année de l’instance courante, soit 366 ou 365 moins le nombre de jours déjà passés, selon que l’année est bissextile ou non.
Recopier et compléter le script de la méthode nb_jours_restants
ci-après :
def nb_jours_restants(self):
j = 365
if ...:
j = 366
return j - ...
On dote la classe Date
de la méthode nb_jours_depuis
qui prend en paramètre une
autre instance other
de la classe Date
et qui renvoie le nombre de jours écoulés entre
la date de l’instance other
et la date de l’instance courante.
def nb_jours_depuis(self, other):
if other.get_annee() > self.get_annee():
return -1
if other.get_annee() == self.get_annee():
if other.nb_jours_passes() > self.nb_jours_passes() :
return -1
if other.nb_jours_passes() == self.nb_jours_passes() :
return 0
nb_jours = self.nb_jours_passes() + other.nb_jours_restants()
for annee in range(other.get_annee()+1, self.get_annee()):
d_suivant = date(1, 1, annee)
if d_suivant.est_bissextile():
nb_jours += 366
else:
nb_jours += 365
return nb_jours
On crée les instances de la classe Date
suivantes :
>>> d1 = Date(15, 6, 2024)
>>> d2 = Date(15, 6, 2024)
>>> d3 = Date(15, 7, 2024)
>>> d4 = Date(15, 6, 2025)
>>> d5 = Date(15, 6, 2022)
>>> d1.nb_jours_depuis(d2)
>>> d1.nb_jours_depuis(d3)
>>> d1.nb_jours_depuis(d4)
>>> d1.nb_jours_depuis(d5)
Le timestamp
est le nombre de secondes qui se sont écoulées depuis le 1er janvier 1970 à 00h00. Il s’agit de la date de la mise en marche du système d’exploitation UNIX
.
Par exemple, le 01/01/2024 à 00:00:00
correspond au timestamp
de 1704063600
.
timestamp
qui renvoie le nombre de secondes qui se sont écoulées depuis le 1er janvier 1970.
def timestamp(self):
d = ...
return self.nb_jours_depuis(d) * 24 * 3600
Projet : créer un programme Python faisant intervenir les classes.
Consignes :
On souhaite avoir un code avec de "bonnes pratiques" donc :