Manipulation de points
On considère la classe nommée Point ayant les attributs suivants :
__abs: attribut privé de typefloatpour représenter l’abscisse du point ;__ord: attribut privé de typefloatpour représenter l’ordonnée du point.
- Définir la class
Pointet 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_distancequi 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_milieuqui 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
TroisPointset 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_alignesqui retourneTruesi les trois points sont alignés,Falsesinon.
La signature de la fonction estsont_alignes(self) -> True.
- Définir la méthode
est_isocelequi retourneTruesi les trois points forment un triangle isocèle etFalsesinon.
- (Facultatif car HP) Implémenter une version statique (méthodes décorées par le décorateur
@staticmethod) des deux méthodescalcul_distanceetcalcul_milieu.
- Tester tous les objets et méthodes depuis la fonction
maindu 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
AdresseetPersonnedans deux fichiers différents. Ne pas oublier de définir les getters/setters et les constructeurs. -
Définir une troisième classe
ListePersonnesayant un seul attributpersonnes: un tableau d’objetsPersonne.
Définir les getters/setters et le constructeur de cette classe. La signature de la fonctionset_personnesestset_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 tableaupersonnessi l’attribut__nomd’un objet de typePersonneest é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) -> boolqui permet de vérifier dans le tableaupersonnessi 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 tableaupersonnesayant 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_nomparnouveau_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ètrenomparnouvelle_ville. -
Dans la fonction
main, tester toutes les méthodes réalisées dans les questions précédentes.