POO, documentation et tests - TP5
Introduction
Créer l’arborscence
Vous pouvez créer chaque dossier et fichier à la main, ou utiliser dans un terminal Git Bash les commandes ci-dessous (mkdir : make directory):
# Sur la VM ensai
mkdir -p /p/Cours1A/IPOO/TP5/Exercice_{1..5}/
# Sur un Datalab Onyxia
mkdir -p /home/onyxia/work/IPOO/TP5/Exercice_{1..5}/
Moodle
1 Exercices
1.1 Exercice 1
-
-
- dans votre Explorer à gauche apparait l’arborescence des dossiers et fichiers de Exercice_1
-
-
Attributs privés
En rendant les attributs de classe privés, vous pouvez contrôler strictement l’accès à ces attributs.
Vous pouvez fournir des méthodes spécifiques : “getter” et “setter”, pour manipuler ces attributs de manière contrôlée et sûre.
Exemple :
Avec un attribut public
, aucun controle n’est effectué sur prix.
Il est alors possible à l’extérieur de l’objet de :
- obtenir sa valeur
- modifier sa valeur, et même son type
article.py
class Article:
def __init__(self, prix):
self.prix = prix
main.py
= Article(5)
a
= "toto"
a.prix = True
a.prix
print(a.prix)
# True
Avec un attribut privé
, il est possible de mettre en place des controles
article.py
class Article:
def __init__(self, prix):
self.__prix = prix
def obtenir_prix(self):
"""Getter"""
return self.__prix
def modifier_prix(self, new_prix):
"""Setter"""
if isinstance(new_prix, int) and new_prix > 0:
self.__prix = new_prix
main.py
= Article(5)
a
# print(a.__prix)
# 'Article' object has no attribute '__prix'
10)
a.modifier_prix(print(a.obtenir_prix())
# 10
Quand vous déclarez un attribut privé dans votre constructeur, Python va renommer votre attribut en ajoutant un préfixe _ClassName
Dans l’exemple ci-dessus, l’attribut __prix deviendra _Article__prix.
= Article(5)
a print(a._Article__prix)
# 5
Si vous tentez de modifier l’attribut __prix, cela va en fait créer un nouvel attribut
= Article(5)
a = 10
a.__prix print(a.__prix)
# 10
print(a._Article__prix)
# 5
Public, privé, protected
Code UML | Préfixe Python | Description | |
---|---|---|---|
Public | + |
Par défaut, tous les attributs et méthodes dans une classe Python sont considérés comme publics. Cela signifie qu’ils peuvent être accédés depuis l’extérieur de la classe. | |
Privé | - |
__ |
Pas natif en Python. Il ne peut être accédé qu’à l’intérieur de la classe elle-même. |
Protected | # |
_ |
Pas natif en Python. Seules la classe possédant l’élément et les classes filles peuvent y accéder. |
:::
1.2 Exercice 2
-
- correction UML : la méthode remplir() renvoie un booléen
-
- Pour celles et ceux qui veulent tenter de nouvelles expériences, écrivez les doctests avant de coder vos fonctions
- méthode remplir() : pensez à bien effectuer toutes les vérifications
- méthode transvaser() : gardez bien en tête les 2 égalités suivantes pour vos calculs
\[volume = volume\_eau + volume\_sirop\]
\[concentration = \frac{volume\_sirop}{volume\_eau + volume\_sirop}\]
1.3 Exercice 3
-
- les attributs sont privés
-
- Importez la classe Point avec
from point import Point
- Importez la classe Point avec
- Module math
2 Templates
2.1 Classe
class MaClasse:
"""titre_ma_classe
Description
Attributes
----------
attribut_1 : type_attribut_1 (str, int, float, list, bool, function...)
desc_attribut_1
attribut_2 : type_attribut_2
desc_attribut_2
"""
def __init__(self, parametre_1, parametre_2):
"""Constructeur de l'objet
Parameters
----------
parametre_1 : type_parametre_1
desc_parametre_1
parametre_2 : type_parametre_2
desc_parametre_2
"""
self.attribut_1 = parametre_1
self.attribut_2 = parametre_2
def ma_methode(self, param1):
"""desc_courte_ma_methode
desc_longue_ma_methode_facultatif
Parameters
----------
param1 : type
desc_param_1
Returns
-------
type
desc_retour
Examples
--------
>>> mon_obj = ma_classe("toto")
>>> mon_obj.ma_methode("xxx")
2
"""
return 2
def __str__(self):
"""Conversion de l'objet en chaîne de caractères
Examples
--------
>>> mon_obj = ma_classe("toto")
>>> print(mon_obj)
Classe d'attribut_1 égal à toto
"""
return f"Classe d'attribut_1 égal à {self.attribut_1}"
2.2 Fonction
Voici un modèle que vous pouvez utiliser pour documenter vos fonctions
def ma_fonction(param1, param2):
"""description_courte
description_longue
Parameters
----------
param1 : type (str, int, float, list...)
description_param1
param2 : type
description_param2
Returns
-------
type_retour
description_retour
Examples
--------
>>> 1+1
2
>>> print("abc")
abc
>>> ma_fonction(xxx, yyy)
valeur_esperee
"""
return None
if __name__ == '__main__':
= ma_fonction(p1, p2)
a print(a)