Manipulation de points
On considère la classe nommée Point
ayant les attributs suivants :
__abs
: attribut privé de typefloat
pour représenter l’abscisse du point ;__ord
: attribut privé de typefloat
pour représenter l’ordonnée du point.
- Définir la class
Point
et le constructeur__init__
permettant d’initialiser les deux attributs.
L’encapsulation est un concept fondamental de la conception objet. L’idée est de ne pas laisser accessibles les attributs depuis l’extérieur de la classe/objet ; les attributs sont alors dits privés (ou protégés si l’accès est nécessaire dans une sous-classe).
En pratique :
|
|
En Python, par convention, le nom des attributs privés commence par __
.
L’accès et la modification des attributs nécessitent alors la définition de méthodes appellées getters et setters.
Les noms de ces méthodes sont, par exemple pour l’attribut __abs
, get_abs
et set_abs
.
-
Définir les getters et les setters pour les deux attributs.
Modifier la méthode__init__
de façon à ce qu’elle utilise les setters. -
Définir la méthode
__str__
qui retourne la représentation mathématique d’un point sous forme d’une chaîne de caractères :"(abs, ord)"
. -
Définir la méthode
calcul_distance
qui calcule la distance du point courant à un point passé en argument.
La signature de la fonction estcalcul_distance(self: Point, p: Point) -> float
.
- Définir la méthode
calcul_milieu
qui retourne un objet situé à égale distance du point courant et d’un point passé en argument.
La signature de la fonction estcalcul_milieu(self: Point, p: Point) -> Point
.
On considère maintenant la classe nommée TroisPoints
ayant les attributs suivants :
__premier
: attribut privé de typePoint
;__deuxieme
: attribut privé de typePoint
;__troisieme
: attribut privé de typePoint
;
-
Définir la class
TroisPoints
et le constructeur__init__
permettant d’initialiser les trois attributs. -
Définir les getters et les setters pour les trois attributs.
Modifier la méthode__init__
de façon à ce qu’elle utilise les setters. -
Définir la méthode
sont_alignes
qui retourneTrue
si les trois points sont alignés,False
sinon.
La signature de la fonction estsont_alignes(self) -> True
.
- Définir la méthode
est_isocele
qui retourneTrue
si les trois points forment un triangle isocèle etFalse
sinon.
- (Facultatif car HP) Implémenter une version statique (méthodes décorées par le décorateur
@staticmethod
) des deux méthodescalcul_distance
etcalcul_milieu
.
- Tester tous les objets et méthodes depuis la fonction
main
du programme.
Carnet d’adresses
On considère les deux classes Personne
et Adresse
.
Les attributs de la classe Adresse
sont :
__rue
: un attribut privé de type chaîne de caractères.__ville
: un attribut privé de type chaîne de caractères.__code_postal
: un attribut privé de type chaîne de caractères.
Les attributs de la classe Personne
sont :
__nom
: un attribut privé de type chaîne de caractères.__sexe
: un attribut privé de type chaîne de caractères (cet attribut aura comme valeur soit’M’
soit’F’
).__adresses
: un attribut privé de type tableau d’objet de la classeAdresse
.
-
Définir les deux classes
Adresse
etPersonne
dans deux fichiers différents. Ne pas oublier de définir les getters/setters et les constructeurs. -
Définir une troisième classe
ListePersonnes
ayant un seul attributpersonnes
: un tableau d’objetsPersonne
.
Définir les getters/setters et le constructeur de cette classe. La signature de la fonctionset_personnes
estset_personnes(self, p: Personne) -> None
. -
Définir la méthode
recherche_par_nom
, de signaturerecherche_par_nom(n: str) -> Personne
, qui permet de chercher dans le tableaupersonnes
si l’attribut__nom
d’un objet de typePersonne
est égal à la valeur du paramètren
. Si c’est le cas, la méthode retourne le premier objet correspondant, sinonNone
. -
Définir la méthode
test_code_postal
, de signaturetest_code_postal(cp: str) -> bool
qui permet de vérifier dans le tableaupersonnes
si un objet possède au moins une adresse dont le code postal égal au paramètrecp
. Si c’est le cas, elle retourneTrue
, sinonFalse
. -
Définir la méthode
compte_personne_ville
, de signaturecompte_personne_ville(ville: str) -> int
, qui permet de calculer le nombre d’objets dans le tableaupersonnes
ayant une adresse dans la ville passée en paramètre. -
Définir la méthode
edit_personne_nom
, de signatureedit_personne_nom(ancien_nom: str, nouveau_nom: str) -> None
, qui remplace les noms de personnes ayant un nom égal à la valeurancien_nom
parnouveau_nom
. -
Définir la méthode
edit_personne_ville
, de signatureedit_personne_ville(nom: str, nouvelle_ville: str) -> None
, qui remplace les villes de personnes ayant un nom égal à la valeur du paramètrenom
parnouvelle_ville
. -
Dans la fonction
main
, tester toutes les méthodes réalisées dans les questions précédentes.