POO Python : API REST et affichage Rich
Session du 27 mai 2025 à 21h00
Pratique & Live Coding
Librairie Standard & Modules
Programmation Orientée Objet (POO)
Deviens membre Premium
Cette session de mentorat est réservée aux membres Premium. Rejoignez-nous pour accéder à toutes les rediffusions des sessions de mentorat !
Premium
- +100h de formations
- +180 exercices de code
- +100h de mentorats en rediffusion
- 20 projets
- Mentorats groupés hebdomadaires
- Support individuel avec nos mentors
POO Python : API REST et affichage Rich
Nous allons faire de la POO pour extraire les informations d'une API, les parser, et les rendre avec rich.
Nous allons voir l'encapsulation, mes méthodes et attributs privés, ainsi que le principe de getter / setter.
00:00:00 :Non, c'est la face directe. OK, super. Bonsoir tout le monde. Est-ce qu'il y en a ici qui sonttrès forts en PO? Ou qui sont moyens en PO, on va dire. Ou tout le monde est à l'aise
00:00:24 :avec ça? Juste pour faire un petit sondage. OK, nickel. Benjamin en Python, OK. On vafaire un exemple que j'ai un peu improvisé. C'est un peu improvisé, donc ce ne sera pas
00:00:48 :parfait, mais c'est un petit peu de PO. Tu connais, Baptiste. OK, tu connais, j'aime bien.Salut à tous. Ça y est, j'ai le son. OK, super, t'as le son. Nickel. OK, alors je vais partager
00:01:07 :mon écran. Du coup, ce soir, on va se faire un petit programme. On va se faire 2-3 classes. Eten fait, on va séparer les responsabilités. Il y en a une qui va aller chercher la donnée sur
00:01:22 :Internet. Une autre qui va permettre d'afficher l'interface utilisateur. Et puis une qui vapermettre de, comment dire, de restituer les données. On va se faire un truc comme ça.
00:01:30 :Donc, je sais qu'il y a Stéphane qui voulait parler d'EtherCeter ce soir. Et donc aussi,je pense au passage d'encapsulation. Donc, on va rapidement en faire, en fait. J'ai pris un
00:01:48 :exemple un peu global. On va faire l'encapsulation d'un EtherCeter. On va devoir définir uneexception custom, donc ce qui est demandé au Toza. En gros, ce qu'on va faire là,
00:01:58 :sauf les librairies tiers, c'est des choses que, pour ceux qui passent au Toza, que vous pouvezavoir. Donc, ça permet de voir ces concepts-là. Donc, je vais partager mon écran, déjà. C'est
00:02:09 :pas mal. J'en ai déjà un VS Code d'ouvert. On ne peut pas mettre que là. Non, c'est pas ça.Voilà, vous voyez mon écran là ? Oui, c'est bon. C'est bon ? OK. Du coup, on va se servir de ce
00:02:35 :site-là, REST Countries. Donc, ça, c'est pour aller chercher des données sur des pays,sur Internet, en fait, si il n'y a pas de pays. Je n'arrive pas à l'accepter. C'est bon. Je ne sais
00:02:52 :pas s'il a réussi. Christophe, je ne sais pas s'il est là, si ça a fonctionné. Non, il est là.Salut, Christophe. Je ne sais pas si le son passe pour toi. OK, c'est bon, il est là. Du coup,
00:03:14 :je disais, on va se servir d'une petite API, REST Countries, ce qui est sympa. Par exemple,il donne des endpoints, ici. Ça permet, en fait, de, on va le tester, de récupérer, en fait,
00:03:28 :des données sur un pays. Si je la teste, j'ai fait une erreur. Hop là, j'ai fait une erreur.Voilà. Donc, en fait, ça permet de donner des infos sur un pays. Donc, comme ça, c'est un peu
00:03:43 :de bazar. Donc, le but, c'est de récupérer ça et de parser ça et de faire le ménage. Donc,pour ça, on va utiliser l'API, comme je disais. Au passage, on va utiliser Rich. Je ne sais pas
00:03:55 :s'il y en a qui font le projet du mois, mais en CLI. C'est quoi le projet du mois ? En fait,on a lancé ça le 1er mai. Ça a commencé le 1er mai et c'est, en fait, le portfolio, c'est ça. Donc,
00:04:17 :ça a commencé le 1er mai. Donc, c'est soit, il y en a qui le font en Django. Donc, c'est ungestionnaire de stock. Il y en a qui le font en Django et il y en a qui le font sur Terminal.
00:04:25 :Voilà. Donc, pour ceux qui débutent en Terminal, c'est sympa. Et après,ceux qui sont plus avancés le font en Django. Donc, on va utiliser Rich ici, qui est pratique
00:04:41 :pour afficher du tableau. Et Requests, qui est pratique pour aller chercher des données surInternet. Voilà. Donc, comme je disais, c'est un projet vraiment... On va un peu improviser ça.
00:04:52 :J'ai des grandes idées, mais voilà. Je me suis tout noté, en fait, cet après-midi. Et donc,pour ça, on va avoir besoin de plusieurs choses. Alors, déjà, on va devoir installer Requests.
00:05:07 :Alors, pour ceux qui font le Toza, n'oubliez pas, il n'y a pas de librairie tierce au Toza 1.Par exemple, Requests, ce que j'installe avec Pip, là, vous ne l'aurez pas. Je le fais là juste
00:05:20 :pour l'exemple du projet, mais sinon, il n'y aura pas besoin. C'est quoi déjà l'introduction ? Commentil s'installe ? Lui, c'est Rich. Tout simplement, je ne sais plus. Ouais, c'est ça, Rich. J'ai
00:05:34 :utilisé ça il y a longtemps. C'est Rich. Et on va avoir besoin aussi de... C'est tout ? Ouais,c'est bon. Voilà. Donc, on va installer ça. Donc, on va, du coup, créer cette application qui
00:05:50 :va chercher des données sur Internet et va nous les rendre dans un tableau. Donc là, c'est vraimentpour répondre à la demande, un peu pour voir l'encapsulation et Getter, Setter, et puis d'autrespetits concepts au passage. Donc, voilà. Donc, en gros, le but, là, c'est d'avoir... On va faire
00:06:09 :ça comme ça. En gros, on va avoir une classe qui récupère les... Une classe qui va récupérer lesdatas. Une classe pour afficher, en fait, pour l'interface utilisateur. Voilà. Et on va avoir
00:06:26 :une classe qui représente un pays. Allez, on va faire ça. Une classe qui va représenter unpays. Ouais, ça me paraît pas mal. Donc, on va faire comme ça. On va rester sur un pays,
00:06:38 :on va pas s'amuser à boucler, à aller chercher plusieurs pays. On va faire ça avec un, c'estdéjà pas mal. Donc, pour commencer, on va... En fait, on va pas faire qu'une seule classe parce
00:06:49 :que ça va être le bazar si... On va séparer un peu les responsabilités. Donc, même si ce queje fais, là, va pas être parfait, au moins, je vais faire en sorte de respecter un maximum ceprincipe-là. Donc, on peut se faire une classe CountryData. Et comme je disais, cette classe-là,
00:07:04 :elle va être... C'est elle qui va devoir aller chercher sur l'API. Ah, il y a Arcel qui essayed'argenter. Je vais l'accepter. Voilà. Donc, c'est elle qui va devoir aller chercher les données
00:07:22 :sur l'API. Et donc, voilà. Comment je pensais ça ? Pour commencer, ici, c'est une classe oùj'ai pas besoin de constructeur. En fait, ça va être une classe où on va avoir qu'une static
00:07:38 :méthode. Vous m'arrêtez si jamais, au niveau des concepts, ça bloque un peu. Donc, on va avoirune static méthode. Donc, par exemple... Hop ! Donc, ça, par exemple, question Tosa. Comment définir
00:07:53 :une static méthode ? Et donc, on va se faire une méthode où on va aller chercher des données.Voilà. Alors, j'ai prévu, en fait... J'ai vu qu'on pouvait chercher des données de différentes
00:08:04 :façons. C'est ouf ! On pourrait aller chercher, par exemple, par le nom, par la capitale. Donc,on va faire ça de façon différente. On va faire ça capitale et par le nom. Ce sera déjà bien. Donc,
00:08:19 :ce que je me suis dit, c'est qu'on pourrait faire un truc, genre, le terme, si c'est capitale ouconcrete, par exemple. Et ici, ça va être le mot qu'on recherche. Donc, le pays ou la capitale.
00:08:31 :Tac ! Et maintenant, on va aller importer, déjà, un request. Hop là ! Alors, pour ceux qui passentle Tosa, n'oubliez pas, pour aller chercher des données sur Internet, c'est URL libre, enlibrairie standard. Vous n'aurez pas de questions là-dessus, mais vous pourrez en avoir une là-dessus.
00:08:52 :Il n'y en a pas beaucoup. Elles ne sont pas trop violentes, les questions dessus. Voilà. Juste à voirà quoi ça sert, quoi. Donc, en fait, quand on va vouloir aller chercher des données, en fait,
00:09:01 :sur la pays, ce qu'il faut se dire, c'est, est-ce qu'on va chercher par rapport à la capitale ou parrapport au nom du pays. Donc, c'est pour ça que je me suis dit, avec un terme ici, on va mettre
00:09:16 :capitale ou concrete, on va savoir. Et là, le mot recherché. Alors, static method, puisqu'ici,je n'ai pas encore vu d'intérêt de créer, en fait, de, comment dire, de grossir un peu. C'est
00:09:29 :assez grand, mon écran, ça va ou je grossis un peu ? Est-ce que c'est moi ? Ça va pour moi. Est-ceque ça vient de moi ? Je vois la liste de tous les participants qui me prend un tiers de mon écran,
00:09:44 :c'est normal, non ? Tu peux agrandir au pire. J'agrandis pas l'écran, du coup, c'est bon pourvous. Je viens de voir, ah oui, les trois petits points, ouais, c'est pour dire qu'en gros,
00:09:59 :j'ai prévu de mettre quelque chose ici, en fait. Voilà, j'ai prévu de mettre quelque chose. Maispour l'instant, j'ai réfléchi en même temps. Et donc, voilà. Donc, le but de cette classe-là,
00:10:14 :c'est de chercher les données. Alors, je disais, il n'y a pas de constructeur init. En fait,il n'y aura qu'une méthode, c'est tout simplement celle-ci. Donc, on pourrait se dire qu'en faisant
00:10:23 :une statique méthode, on pourrait se dire, en fait, ça pourrait très bien être une simplefonction dans le programme. Ici, je me dis, je vais quand même créer une classe parce qu'on
00:10:29 :pourrait peut-être penser à une évolution future du programme et ajouter de la configuration. Donc,pour l'instant, je vais laisser une classe avec une statique méthode. Donc, l'idée, c'était de se
00:10:40 :dire, si le terme recherché, c'est country, ici, on va en fait aller chercher, c'est request.get,on va aller rechercher, il est où mon, il est là, tac. On va aller copier ça. Ça va être d'aller
00:11:07 :chercher sur cette URL là et ici, on va supprimer ça. Et d'aller chercher les termes, d'allermettre en fait les termes recherchés. Si c'est pas, on cherche pas par pays, on va dire qu'on
00:11:27 :va rechercher par capitale. Et donc là, la différence, on va prendre ça. On va copier iciet ici, c'est pas name, c'est capitale. Et capitale, vous l'avez ici. C'est ça, capitale.
00:11:47 :Et vous mettez, en fait, vous mettez le nom de la capitale et ça vous trouve le pays. Par exemple,si je suis ici, si je mets capitale et qu'on met Paris, ça ne marche pas. Pourquoi ? C'est normal,
00:12:05 :j'ai oublié un A. Et voilà, ça va nous trouver sur la France. Donc voilà, ça c'est juste pouraller chercher la donnée. Et ici, on peut très bien se dire, par exemple, si je mets une Paris,
00:12:20 :si je fais une faute, je ne sais pas, quelque chose qui n'existe pas. Hop, j'ai une erreur 404.Donc, quand vous faites des recherches comme ça, c'est important de gérer l'erreur 404.
00:12:31 :Donc déjà, ce qu'on va faire, c'est qu'on va attribuer une variable ici, une réponse. Et onpeut très bien dire, on va refaire une condition, donc if response. Et avec request, en fait,
00:12:46 :on peut savoir quel est le statut code qui est retourné par la requête. Donc si c'est 404 ici,et bien on peut très bien dire raise. Donc là, on va lever une exception. Pour ceux qui font le
00:13:01 :Tosa ou les autres, est-ce que vous savez comment créer une exception personnalisée ? Ou pas ?Comment on fait, pardon ? Non, pour créer l'exception personnalisée. On prend l'exception
00:13:17 :en héritage ? Ouais. Ok, c'est ça. Donc ça, bon là, je n'aime pas trop faire des exceptionspersonnalisées, mais c'est juste vraiment pour voir comment on fait. Donc là, on peut très
00:13:31 :bien dire class country not found. Ils aiment bien mettre ces sans pitons. Erreur, et on héritede exception. Et là, on a une exception personnalisée. On hérite de exception, donc on hérite de tout
00:13:48 :ce qu'il y a dans l'exception. Je regarde ce qu'il y a de chose. Je réfléchis juste un truc. Et donclà, on a une exception personnalisée. Donc là, on pourrait très bien dire country not found,
00:14:01 :comme ça, on sait quel type d'erreur il y a. Et là, on va dire le pays n'a pas été trouvé, parexemple. Voilà, basiquement. Donc comme ça, s'il y a un problème, on arrête le programme. Et sinon,
00:14:16 :qu'est-ce qu'on fait ? Eh bien, on va retourner la réponse qu'on récupère en allant chercher surnotre API. Et pour être tranquille, on va ici convertir la réponse ici en JSON. Donc ça,
00:14:30 :c'est request qu'il fait pour nous. On peut le faire avec, comme je disais tout à l'heure,avec urllib. Je ne sais plus quelle partie, en fait, il faut appeler urllib et après,
00:14:50 :il ne s'utilise tellement jamais. Il faut penser à utiliser JSON. Alors que là, avec request,en fait, il faut tout faire en une fois. La réponse et le JSON derrière. Donc ça, c'est pratique.
00:14:58 :Est-ce qu'on ne pourrait pas s'amuser aussi à faire une sauvegarde sur le disque ? Bon,on verra après. Donc pour l'instant, ça va. Là, on a, du coup, une classe avec une méthode qui
00:15:10 :permet d'aller chercher un pays dynamiquement. Donc là, par exemple, si je fais ça, on va fairecountry data. Et on va dire qu'on veut chercher un pays. Si j'écris mal, ça ne va pas le faire.
00:15:31 :Country. Et ici, notre terme, ça va être France. Je regarde si je n'ai pas de bug quand je lance.Non, OK, c'est bon. Et maintenant, je vais faire un print.
00:15:42 :Une question ? Oui. Dans le cas où tu écris, tu crées une instance de country data,tu ne pourrais pas aller sur countrydata.getdata directement ? Attends, tu m'as dit quoi ? Tu crées
00:16:00 :une instance de country data. Non, oui, je suis d'accord. Le mieux ici, on va faire ça. On vafaire ça, countrydata ici. Tu peux très bien faire ça directement, c'est même mieux.
00:16:09 :Puisqu'on a une méthode statique, on n'a aucune raison de l'instantiel. C'est l'habitude. Merci.C'est quelque chose qui m'a mélangé dans Python, c'est que tu peux aller chercher dans les instancesce que tu définis en statique. Puis tu peux même les modifier, on dirait.
00:16:29 :Alors, dis-moi, répète. Je répète. On peut aller, mettons que j'initialise une variabledans country data, je dis que par défaut c'est Paris. La réponse par défaut. Tu pourrais aller
00:16:47 :modifier Paris puis dire que c'est autre chose à la place même si c'est statique.Bah en fait, oui, on pourrait très bien modifier, mettre Paris et mettre ici le capital. Mais c'est
00:16:59 :parce qu'en fait, tu es sur une méthode statique, donc c'est comme si tu utilisais quasiment unefonction normale. En fait, dis-toi que ça, on pourrait même le mettre vraiment en fonction
00:17:10 :normale. En fait, c'est juste une classe avec une méthode statique, il n'y a pas grand intérêtd'avoir une classe comme ça. Donc là, si on teste, je print ma réponse ici. Quand on teste,
00:17:23 :on voit bien que j'ai un retour de 100 ici. Donc c'est que la requête, elle a abouti et que j'airécupéré les données. Par contre, est-ce que je n'ai pas fait d'erreur ? Oui, j'ai ma 404. Je
00:17:36 :retourne bien mes données. Donc pour moi, c'est bon. Je vais vérifier un truc. Il y a un truc qui meparaît bizarre. J'ai mon status code ici. Là, je fais mon raise. J'arrange ma réponse pointu donne.
00:17:53 :Il y a un truc qui me paraît bizarre. Je ne sais pas quoi. Ici, j'ai mon country. Je récupère mesdonnées. Bon, on verra après sur la suite du programme. Excuse-moi, la classe country,
00:18:12 :notre fond d'erreur là, il n'y a qu'à mettre un pass là-dedans et c'est bon ? Oui, en fait tu ascréé ton exception personnalisée. Il n'y a rien dedans ? Non, c'est vraiment juste le nom
00:18:28 :d'exception qu'on a surchargé. On a créé une nouvelle classe exception. Je n'ai plus en têtetous les paramètres qu'il y a. Ça m'est arrivé une fois de faire une exception personnalisée avec
00:18:40 :plusieurs attributs. Déjà, moi je fais rarement, je n'en fais jamais des personnalisées. C'est pourvous montrer que là, surtout Pascal, toi tu risques de l'avoir. Autosave, ils vont te demander d'en
00:18:53 :faire une. Donc, pour créer une exception de base personnalisée, il n'y a même pas importeexception. Tu hérites d'exception, tu as ton nom d'exception et tu te mets de base. Et là,
00:19:07 :tu as une exception personnalisée en fait. Tu hérites d'exception, donc après tu peux mettreton message en fait ici, directement dedans. Dans le constructeur en fait, l'exception.
00:19:15 :Voilà. Bon, j'ai ma réponse de 100, c'est très bien. Hop, nickel. On va continuer. Donc maintenant,il faudrait qu'on ait une petite interface. Une interface, on va dire, pour l'utilisateur.
00:19:33 :Donc, voilà ce que je ferai. Et ici, on va faire un constructeur de classe. Donc,tout à l'heure, c'est Caroline qui demandait pour ce qui est encapsulation, je crois. C'est toi,
00:19:55 :hein ? Oui, c'est moi. Ok. Donc là, on va avoir ici, dans le constructeur, on va appelercountryData. On n'est plus sur l'injection là. Et on va utiliser en fait, la classe countryData.
00:20:08 :Donc là, on est sur l'injection. Et c'est de la, on appelle ça de l'agrégation. Donc en fait,l'agrégation, alors on va regarder ça tout de suite. CountryData est égal à countryData. Donc
00:20:28 :en fait, ce qui veut dire que dans notre constructeur, quand on va créer notre instance,ici, ce qu'on va faire, c'est qu'on va passer directement la classe countryData, en fait,dans notre interface. Voilà. Et donc, on pourra l'utiliser ici en attributs. On va voir après
00:20:47 :à quoi ça peut servir. Et ensuite, on va dire self.data, on va avoir des données. Ça va êtreune liste. Voilà. Comme ça, on pourra enregistrer les données dans notre liste. Donc,
00:20:58 :maintenant, l'utilisateur, on voudrait qu'il, hop là, je peux voir un message.Non, c'est moi qui ai levé la main. Ok. D'accord. Je me demandais, est-ce que c'est la même chose
00:21:14 :quand tu écris self.data et liste comme tu viens d'écrire ou bien deux crochets? C'est pareil.C'est la même chose? C'est la même chose. J'ai l'habitude de faire comme ça, donc j'ai
00:21:24 :toujours fait comme ça. C'est bon. Donc, là, on va créer une méthode statique. On ne va pas faireque ça. Après, on va créer des méthodes d'instance quand même. Donc, une statique méthode, et on va
00:21:35 :se dire, et elle va être privée, et on va l'appeler askToUser. On va demander à l'utilisateur,ce qu'il veut faire comme choix, s'il veut se rechercher par pays ou par capital. Par nom de
00:21:52 :pays ou par capital. Donc là, je me suis dit, je vais me faire un tuple ici avec, en choix 1,2. Voilà. Et on va printer déjà le message. Donc ça, pour ceux qui ne savent pas, ça permet
00:22:10 :d'assister sur plusieurs lignes. Là, par exemple, si je vais faire... Tout le monde le connaît,ça ou pas? Oui. Normalement, oui. Je pose la question au cas où. Voilà. Et du coup,
00:22:26 :on va se mettre 1, pays. Voilà. Et puis 2, capital. Voilà. Donc, capital, en français.Et maintenant, l'utilisateur, il va devoir rentrer son choix. Donc, on va utiliser un input. Donc ça,
00:22:44 :pareil, Tosa, c'est à savoir, bon, c'est la première chose qu'on voit, mais au cas où. Donc,j'essaie de voir plein d'exemples qui peuvent être vus de manière interactive avec un exemplecomplet. Donc ici, on a un input. On va demander à l'utilisateur de rentrer son choix. Et on va se
00:23:00 :dire si le choix... Alors, je vais peut-être l'appeler choice. Je suis en anglais. Voilà.Not in choices. Donc ça, c'est pour vérifier si le choix, il est dans le tube. Là, s'il ne l'est
00:23:17 :pas, ce qu'on va faire, c'est qu'on va se dire, print, on va mettre mauvais choix. Je ne suis pasinspiré. Mauvais choix. Et puis, on peut se dire, on retourne dans le coin. On arrête là. Et donc,
00:23:33 :sinon, on va retourner le choix. Donc là, on a une méthode statique encore. Alors, à quoi j'avaispensé, je voulais faire aussi une méthode, du coup, que je vais aussi appeler getData ici,mais pour l'interface utilisateur. Et ici, ce que je voulais faire, on va faire ça. On va se dire,
00:23:54 :voilà, choice est égal à countryInterface.askTweezer. Et donc là, il y a de l'encapsulation. Est-ce queça va là ou pas? Je regarde s'il y a des messages. Alors Thomas, je n'avais pas vu, surtout, en fait,
00:24:24 :quand tu fais un print, tu peux printer comme ça. Dès que tu as un print, tu peux faire ça et tu peuxavoir tes lignes, tes solignes quand tu veux, en fait. Donc là, en fait, c'est l'encapsulation. Alors Caroline,
00:24:39 :tu demandais pour ça, c'est bon ou pas pour toi, ça? Je ne sais pas si tu m'entends. Alors, tu as un problèmede micro tout à l'heure. Je ne sais pas si ça... Bon, je vais continuer. En gros, donc là, ce que je fais,
00:24:56 :c'est que j'utilise ici cette méthode-là, dans GetData, et je vais récupérer, en fait, le choix qui est retourné ici.Je vais le récupérer ici, voilà. Et donc, je me dis, si le choix ici, si le choice est égal à 1, il vaut 1, je veux dire,
00:25:18 :le country ici est égal à 1 input, et je vais dire le pays souhaité. Quel pays vous voulez, voilà. Et là, ici, donc là,c'est pareil, on va utiliser justement notre agrégation, on va utiliser self.countryData, et on va utiliser la méthode GetData qu'on a ici.
00:26:24 :on va mettre capital souhaité, capital souhaité, hop, ici, on va l'appeler capital en anglais, et on va mettre capital, et voilà.J'ai pensé à modifier ici, oui, c'est bon. Ok, oui, tu as dit quoi? Ah, merci, oui, oui, je cherchais, ok, on avait dit capital, oui, oui, merci beaucoup.
00:26:57 :Je m'en déraie, j'étais là. Donc là, justement, ici, on a, on dirait de l'encapsulation, parce qu'on va utiliser cette méthode-là dans GetData.Et l'agrégation, puisqu'on va utiliser la classe CountryData ici, qui est en attribut, on l'utilise ici. Donc comme ça, c'est vraiment chacun ses responsabilités.
00:28:09 :Maintenant, dernière étape, on va créer une méthode qui va nous permettre de récupérer, d'afficher les données, on va dire, mais par contre,on va les, ce qu'on appelle les parser, les traiter avant, et on va utiliser justement un getter et un setter. Je pense qu'on va, je vais faire comment ?
00:30:44 :Ça va, pourquoi ?Oui, c'est bon. Dites-moi, franchement, si ça vous paraît flou, vous le dites. Là, j'essaye de voir plusieurs concepts en un. Donc, je recapitule, country data pour récupérer les données, l'interface, une méthode privée. Donc, ça, Coraline, du coup, tu connais, je pense, c'est par rapport à ça que tu posais la question sur l'encapsulation, que je réutilise ici.
00:31:07 :Dans le fond, ce que je comprends, c'est que l'encapsulation, c'est juste parce qu'il est tiré en avant qu'on ne va pas l'appeler directement.En fait, oui. Le but, en fait, c'est que pour l'utilisateur des interfaces, qu'il soit, c'est simple et qu'en fait, derrière, tu as des méthodes, si besoin, des méthodes privées qui tournent, qui font des choses un peu plus complexes, entre guillemets, que lui, il n'a pas à savoir, entre guillemets. C'est pas utile pour lui. Et donc, toi, à ce que tu dis.
00:33:47 :Ou c'est une erreur peut-être ? OK. Attributs privés. Eh bien, justement. Alors, déjà, tout à l'heure, on parlait des méthodes privées.C'est des méthodes qui ne doivent être appelées que dans la classe. Les méthodes privées, on n'a pas les appelées. Donc là, c'est quoi ? C'est country interface.
00:34:22 :Techniquement, on peut le faire, mais la convention dit qu'on n'a pas à le faire. Donc, on utilise les méthodes privées que dans la classe.Donc, je réutilise cette méthode-là dans une méthode de la classe qui, elle, va utiliser la méthode. Ici, on va utiliser un attribut privé.
00:35:21 :Pour l'instant, je n'en dis pas plus. C'est bon pour l'instant ou pas ? Fais-le dire. Je vais regarder le chat entre les deux.Bon, on va continuer avec ça. Donc, ça, on n'a pas le droit. OK. Donc, en plus, il faudra de la data. Lui, il y a notre country, d'ailleurs. Pour l'instant, je vais le faire.
00:38:05 :Donc, quand on regarde, ça ressemble comme ça. Ici, on a une liste, et après, on a le dictionnaire, ici.OK. Donc, du coup, si on veut récupérer le nom, est-ce qu'il y en a qui ont une idée de comment on peut faire ? Donc, on part sur le Data.
00:38:42 :Je vous laisse encore, si vous voulez. Est-ce que vous avez une idée de comment on peut faire, du coup ?Ou alors, c'est Data0.Name.OK. Donc, on est là. On va se faire un 0. Alors, ce n'est pas .Name.
00:39:07 :C'est .Get, entre parenthèses, Name, non ?Oui, entre parenthèses. C'est compris, du coup. Mais, il y a encore, en plus, NameCommon.Donc, on descend, comme ça, le dictionnaire. Donc, on a récupéré, ici, le Name.
00:39:24 :Normalement, ça fonctionne. Ensuite, le Language, en anglais, c'est comme ça.Le Language, en fait, lui, c'était dans Languages, on a vu. Donc, c'est toujours pareil, Data.
00:39:37 :Donc, on pourra se faire une variable pour récupérer Data0. On va rester comme ça, pour l'exemple.Donc, ici, on va récupérer Languages, ici, qui était là. Donc, on a Name.
00:39:53 :Là, on avait Name. Ici, c'est bien Languages. C'est au même niveau, Languages.OK. On a le Languages. Le problème, c'est que le Languages, c'est un dictionnaire. C'est génial.
00:40:04 :Sauf que, en plus, ici, ça veut dire que les clés sont dynamiques. Ça ne va jamais être la même selon le pays.Donc, on va faire en sorte de récupérer toujours le premier élément, à ce moment-là. On va s'embêter.
00:40:15 :On va voir, après, le Languages. On va le faire maintenant.Pour récupérer le premier élément dynamiquement, ici, je pense qu'on va faire un itérateur.Donc, on pourrait peut-être le transformer en triple et récupérer le premier triple.
00:40:29 :En fait, ce qu'on peut faire, c'est qu'on peut faire un itérateur.Donc, ici, on est dans Languages. Ça va nous retourner un dictionnaire.Donc, en fait, il y a des pays où il pourrait y avoir plusieurs langages officiels.
00:40:40 :C'est pour ça qu'ils ont fait ça, je pense. Et donc, ça ne va jamais être la même clé.On ne va pas s'embêter. On va récupérer le premier élément du dictionnaire.
00:40:48 :Vu qu'on ne connaît pas la clé d'avance, ce qu'on va faire, c'est qu'on va le transformer en itérateur.Ça ne paraît pas trop mal. Donc, genre, on peut faire ça, ici.
00:41:00 :Intermarché. Hop, itérateur.Et on va itérer dessus une fois. Voilà.Donc là, en gros, ça veut dire qu'on va atterrir au premier élément du dictionnaire qu'on récupère là.
00:41:17 :Et donc, vous me dites si ça vous paraît compliqué.Ici, on va récupérer la valeur du dictionnaire qui sera, du coup, ici, French.C'est bon, ça ?
00:41:29 :Oui.OK. Donc, on a utilisé un itérateur.Bon, je ne sais pas si je fais ça un peu comme ça à l'arrache, mais je...Ouais, on aurait pu transformer en truc et ainsi de suite, mais c'est rapide à faire.
00:41:42 :La population, c'était facile à récupérer avec...En fait, on peut copier ça et mettre population à la place s'il n'y avait pas de...Ça retenait en entier. Hop.
00:41:56 :Tac.Donc, du coup, vous avez compris. Et on avait dit quoi le dernier ? Il en reste un ?Ah ouais, currency.Je vais être sincère, on va faire pareil que...
00:42:06 :On va faire pareil, en fait, pour currency.Ici, on va se faire un... Hop.Parce qu'il m'avait l'air bien chiant, aussi, celui-là.Je crois que c'est jamais le même. Il est où ?
00:42:20 :Là, voilà, c'était au pluriel.Ouais, donc, en plus, currency va prendre un euro.OK, d'accord.Bon. On va récupérer le premier élément. On va faire pareil.
00:42:29 :Ce qu'on va faire, c'est qu'on va... Tac.Ici, currency.Et on ne va pas récupérer la valeur parce que ça va nous récupérer encore un dictionnaire.
00:42:40 :Donc, on va rester comme ça pour l'instant.La clé, je veux dire. Non, la valeur.Voilà.Et donc, voilà. Donc, là, en fait, je ne sais pas si tout le monde le sait,
00:42:50 :quand vous faites ça, vous pouvez retourner, en fait, un tuple comme ça.Vous pouvez dire Name, Language, Population.Ouais, et Currency. Tac.Est-ce que ça, c'est bon pour tout le monde ?
00:43:05 :Le retour comme ça.Vous me dites.Je regarde un peu sur le chat si ça a l'air d'aller. OK.Ça renvoie un tuple, c'est ça ?
00:43:17 :Ouais. En fait, regarde.Là, tu as fait ça.Et d'ailleurs, alors, on est là-dessus.J'y pense tout de suite.Comment ça s'appelle ?C'est un ancien article du site. Je ne sais pas de quand il date.
00:43:37 :Je pense qu'il y a de ça. Il y a de l'unpacking aussi dedans qui peut être intéressant à regarder.Et je pense qu'ils l'ont mis, cet exemple-là, dans Tibo, je crois.
00:43:45 :Ouais, c'est ça. Je m'en souviens.Au tout début, je l'avais lu et c'est une chose qui m'a beaucoup plu.C'est ça. Donc là, en fait, il fait ça.
00:43:53 :Il renvoie plusieurs choses. Je vais le mettre dans le chat, celui-là.Vraiment, je vous conseille de le lire pour ceux qui ne l'ont pas lu.
00:44:02 :Oui, en fait, pourquoi je fais ça ?Parce qu'en fait, ce qu'on peut faire ici, je ne sais pas si il y en a qui vont deviner ce que je vais faire.
00:44:10 :Mais encore une fois, je vais utiliser de l'encapsulation, l'enconstructeur directement.On ne va pas se gêner. En fait, on peut très bien dire name.Language. On va récupérer quoi ? La population.
00:44:25 :Population, ouais, et la donnée.Et du coup, ce que je fais ici, country.parsedata.Et qu'est-ce qu'on envoie ? Les datas qui seront dans l'enconstructeur ici.
00:44:41 :OK, et donc le nom, on l'a là.Maintenant, le langage, on l'a aussi.Et la population, là.Donc en fait, notre classe, elle va s'initialiser.
00:44:57 :Elle va se construire directement en appelant cette méthode en arrière-plan.Dès le constructeur, boum, elle va attribuer comme ça.Directement pour l'enconstruction.Et ce que je fais, c'est bon.
00:45:11 :Ici, je renvoie 1, 2, 3, 4 éléments.Et là, je récupère 1, 2, 3, 4.Donc, il y a une variable différente.Ça, c'est OK ?
00:45:21 :OK.Je continue.Bon, on va arriver sur la fin.Sur les getter setters, avant, on va se faire juste un petit truc.Ouais, on va se faire un petit truc sympa avant.
00:45:35 :Avant de finir sur les getter setters.Ça va être assez rapide. C'est pas très compliqué à comprendre en plus.On va se faire un display data pour monter Rich.
00:45:42 :Et je pense qu'il y en a certains que ça peut intéresser.Moi, ça m'a servi déjà.Donc là, on va créer un tableau.Je l'ai importé tout à l'heure.
00:45:52 :Non, c'est pas ça que je voulais faire.Je ne l'ai pas importé en fait.On va l'importer directement.J'ai installé en fait la bibliothèque Rich.
00:46:02 :Donc, on va faire rich.table.Importer.Voltec.Prom.Console.Console.Import.Hop là.Là, c'est console.C'est dans la doc.Je ne fais pas ça de tête.
00:46:27 :Je l'ai vu tout à l'heure dans la doc.Je l'ai déjà fait plusieurs fois.Et donc, ici, ce qu'on peut faire, c'est qu'on va se définir un tableau.
00:46:35 :On va utiliser la classe table ici.Et on va dire quoi ?On va dire le titre du tableau.Ça va être une string.Et on va dire...
00:46:47 :Donner de...Non, ce n'est pas ce que je voulais faire.Ce n'est pas ce que je voulais faire.De self c.m.Comme on avait dit à la France.
00:46:59 :Voilà.On va donner un titre au tableau.Type.headCol.Hop.Là, on va en avoir deux.On va mettre le titre.Enfin, le champ.C'est pour l'exemple.
00:47:15 :Ce qui est sympa, c'est qu'on peut donner ici du style.On va dire...Je crois que c'est blue.Il doit y avoir la couleur.Et là, on va copier ça.
00:47:25 :Hop.Et on va mettre ici.Valeur.Hop.Et on va mettre vert.Et maintenant,tout simplement, ce qu'on va faire,c'est qu'on va ajouter des lignes au tableau.
00:47:41 :Donc type.addRow.Tac.On va se dire...La langue.La langue, voilà.Le nom de la ligne.Et qu'est-ce qu'on va avoir ?Le langage.On va avoir...
00:47:59 :On va le copier.Tac.Tac.On va en mettre trois.On avait la population.Voilà.Ici, on va avoir la populationque je peux utiliser dans ma classe.
00:48:15 :C'est privé.Mais j'utilise dans la classe.Et on va finir avec...C'est pas la langue, c'est la monnaie à la fin.Et c'est currency.Voilà.
00:48:27 :En fait, vous avez juste à faire ça.On le solde.Et t'es gars là.On attribue la classe qu'on solde ici.Et ensuite,on instantie et on fait un print.
00:48:39 :On fait un print ici.Hop.C'est comme ça que ça marche.Ici, la librairie riche.Pour ça.Et donc là, on a déjà pas mal de choses.
00:48:51 :Et avant de finir,on va essayer d'imprimer ça, je pense.De se printer ça, plutôt.Donc, je récupère les...Je me fais un get data.
00:49:01 :Et bien, on va se faire un...Dans la France, on va se faire du coupun country.On va passer les datas dedans.Et du coup, je pense qu'on peutse faire du coup un F.
00:49:13 :Et là, moment de vérité.S'il y a un bug,il faut débugger. Vous m'aiderez.Hop.Donc, le pays.Euh, il y a un bug.Alors, il faut que j'y passe.
00:49:27 :OK, c'est normal. OK, j'ai compris.Donc là, il vous dit que les tableaux riche,ils veulent que de la chaînede caractère, et moi, je lui passe un entier.
00:49:35 :OK.Et forcément, la population,ici, c'est un entier.Bon, en passant l'été, on va convertir.Voilà.On recommence.Pays, c'était France.Ouais, voilà.Donc, vous voyez, là, c'est ridicule,mon tableau, mais ça fait quand même un petit tableau.
00:49:55 :Donc, on a la langue, on a la population, on a la monnaie.Donc, bon, là, c'est justepour l'exemple.Mais ça me permettrait de faire des petits tableaux sympas, en fait,sur des projets comme ça,pour rendre vos données de la couleur.
00:50:07 :On peut même faire beaucoup plus de choses,mais là, c'était juste pour montrer, basiquement, que la librairie,elle existe, et qu'elle est pas mal.Euh,voilà. On va passer au getter-setter.
00:50:17 :Salut, Christophe. Je ne sais pas si t'es déjà parti.Euh,OK.Donc, pour ça, c'est bon, du coup.On va finir sur les getter-setters. Jusque-là, ça va.
00:50:27 :Est-ce que ça, du coup, vous pensez vous en servir ou pas?Je sais qu'il est ridicule, mais ça peut être pratique.Oui, je trouve ça...
00:50:33 :Oui.C'est intéressant de voir les deux classes que t'as importées dans ton code.Tu peux se les noter.Table et console.Voilà.J'ai importé ces deux-là.
00:50:45 :En fait,cette librairie-là, j'aime bien pour ça. Moi, je m'en sers de ça.Donc, il y a un titre du tableau.Ça, c'est le titre qu'on a donné.
00:50:53 :On n'a plus les données qu'on a dedans.Je ne sais plus. Moi, j'avais fait un truc.Alors, je l'ai en exemple.Je l'ai en exemple.
00:51:01 :Alors,c'est sur mon autre chaîne.Ah ouais, du coup, je ne sais pas si vous l'avez trouvé.Ça, c'est ma chaînedocstring, entre guillemets.Je l'avais utilisésur quoi?
00:51:15 :On peut voir les petites vidéos.Et sur un projet de...Et là, c'était un peu plus utile.Je vais l'avancer exprès pour voir toutes les...
00:51:23 :Tac.Alors,en fait,j'affichais desdonnées sur un tableau comme ça.Je ne sais pas s'il peut y avoir des... Ouais.On ne voit pas très bien.
00:51:37 :Je ne sais pas s'il peut y avoir un message.Voilà.Et en fait, j'en servais comme ça.J'affichais des messages comme ça de personnes.C'est un exemple.
00:51:47 :C'est un peu petit. Je ne sais pas si on voit bien.J'avais l'auteur du message.Il y a pas mal de choses qu'on peut faire comme ça.
00:51:53 :Il m'a servi à çaune fois.Pour un projet un peu, on va dire, fun, entre guillemets.On va finir surles getter setters, du coup.
00:52:03 :Qu'est-ce que vous voulez faire?Je disais, population. J'avais prévu le coup.On va se la mettre ici.On l'a mis en privé.Voilà.On l'a mis en privé.
00:52:15 :Par convention.On va faire un truc.On va faire un printF.Population.OK.D'abord, il faut que je charge les données.Un pays. France.
00:52:33 :Voilà. Là, j'ai printé la population.C'est ce que je viens de printer, en fait,ici. Vous voyez que je peuxaccéder aux données quand même, même si je n'ai pas le rendant.
00:52:41 :On pourrait vraiment le rendrequasiment complètement privé, on va dire.Si on mettaitdeux underscore devant.Ici, je vais mettre deux underscore.OK.Si je l'appelle maintenant,on indique...
00:52:57 :Je commence.OK.Là, en fait, il vous dit qu'il n'y a pasd'attribut population.En gros, vous ne pouvez pas y accéder.Il y a une technique, maisje ne l'ai même plus en tête.
00:53:11 :Je regarderai après si on a le temps,mais ce n'est pas le principal.Là, on l'a vraiment rendu privé.On va le retirer. En général, ça ne se voit jamais.
00:53:19 :Et ça, ça suffit. Les gens respectent.On sait très bien qu'on n'a pas à l'utiliser.Maintenant, pourquoi on fait ça ?On pourrait très bien se dire, une fois qu'on a créé notre classe France,qu'on pourrait vouloirmettre à jour les nombres d'habitantsde la France.
00:53:35 :Alors,comment ça se passe ici ?On va le faire en bout de classe.On sait très bien.On va créer ce qu'on appelle unepropriété.
00:53:47 :On va l'appeler population.Voilà.Qui va être ici.Instance. Hop.Et on va retourner quoi ?Self.population.Voilà.Maintenant, ce qu'on peut faire, c'est queon va le printerS.population.
00:54:07 :Ça ne va pas marcher.Donc là, on peutprinter la population comme ça.On utilise notre attributprivé dans une classe decountry, donc pas de problème.
00:54:19 :Ce qu'on va réellement appeler pour l'utilisateur,ça va être notre méthode population.Quand on a une propriété comme ça,ici, il n'y a pas besoin d'appeler la méthode.
00:54:27 :Pas besoin des parenthèses.On l'appelle vraiment comme attribut.Pour l'instant, ça va ?Je m'arrête.On va finirsur l'utilité de faire ça.Utilité, ça va être un petitexemple, mais je pense que vous allez comprendre.
00:54:43 :Le but,c'est de protéger à comment va êtremodifiée la population.Pourquoi je l'ai protégée ? Parce queje ne voudrais pas que quelqu'un ici...
00:54:53 :Imaginez qu'on n'ait pas un attribut privé,que ce soit un attribut normal.Sans underscore, on pourrait direF.populationF.populationF.populationF.populationF.populationF.populationF.populationLe but, c'est de direon va se faire unsetter. Là, on va utiliser
00:55:19 :le nom de notre méthodequi est là.On va utiliserle .setter ici.Et on va redéfinirpopulationon va redéfinirle même nom de méthodeet là on va se direon peut lui passer une valeur ici.
00:55:39 :C'est pour mettre à jour l'attribut.Et on pourrait très bien direifvalue est inférieurà 0et bien on peut direraiseUneValueError et direun paysne peut pasavoir une populationnégative.
00:56:01 :Et sinonsi on n'est pas dans ce cas làce qu'on va faire c'est qu'on va se direF.populationF.populationF.populationF.populationF.populationF.populationF.population
00:56:21 :F.populationje sais pas,hein une chose, c'est débilemais c'est pour l'exemple.Je mettrais Django.CapitalFrance, on a un habitant.Maintenantsi je fais.1
00:56:40 :Et je lanceOn a une exceptionUn pays ne peut pas avoir une population négative.Donc en faitVoilà à quoi peuvent servirles getter setter.
00:56:55 :C'est qu'ici on veut pas que les gens touchentà l'attribut ou le modifient comme ils veulent.Ils l'affichent grâce à la propriétéet ils le modifient à traversici le setter.
00:57:05 :Et comme ça, vous, je sais pas, vous pouvez mettremême si c'est inférieur à 60 00050 millions, peu importe.Là c'est un exemple un peu débilemais imaginez un peu tous les casque vous pouvez avoir de possible en fait pour contrôler ça.
00:57:17 :Tout ce qui est possibletout ce qui serait possible d'avoir de logiquevous le mettez ici. Donc si c'est çaet bah non et sinon ouiok on attribue la nouvelle valeur.
00:57:27 :Est-ce que c'est bon ?Est-ce que c'est compris ou pas les getter setter ?Oui.Oui c'est bon.Caroline c'est ta question à la base.
00:57:39 :Est-ce que tu as des doutes ou pas ou c'est bon ?Non c'est bon.Donc voilà.C'est pas plus compliqué que ça en fait.Au tout début quand j'ai commencé il y a deux ansj'ai galéré à comprendre vraimentet mon mentor à l'époqueil m'a expliqué en fait
00:57:55 :voilà quoi c'est attribut privécomme ça personne n'y toucheentre guillemets et puis voilàon contrôle en fait ces attributions de valeuron les contrôle grâce aux setterset puis on les affiche grâce à la propriété quoi.
00:58:07 :Donc voilà. Je sais pas si ça vous a pluou si c'était... ah c'était un peu long je suis désoléil est 22h.J'ai pris un peu de temps.
00:58:17 :Est-ce que ça vous a plu ?Est-ce que c'était un peu long ?Un peu compliqué certains endroits ou ça va ?Non non ça va en fait.
00:58:27 :C'était bien structuré.Ouais c'était pas mal.Ok merci.C'est ce que je voulais en fait.C'est vraiment avoir plusieurs concepts quoi.D'exception, de classe, d'agrégation.
00:58:39 :Pensez-y ça l'agrégation.Ici j'utilise une classe dans une autre classe.L'agrégation c'est parce quela classe... comment dire...il faudrait très bien avoirune instance de CountryData qui existeà part de CountryInterface.
00:58:53 :Que des fois on peut très bien avoirici genre...on le passe pasgenre on pourrait très bien avoir çahoptacet on pourrait très bien avoir ça.
00:59:07 :Donc en fait là c'est plus de l'agrégation c'est de la composition.C'est que CountryInterfacel'instance elle est créée en même temps que CountryDataenfin CountryData elle est crééeen même temps que CountryInterfaceet il sera détruit en même temps.
00:59:19 :Que là on pourrait très bien quand on zetteà l'heure de l'agrégation on peut très bien avoirune instance de CountryData à part et une CountryInterface à part.
00:59:25 :Voilà.Donc voilà.Ok bah c'était le petit motde la fin.Je vais couper monprésentation.Hop.Bon écoutezen tout cas merci on était pas mal ce soir.
00:59:43 :Est-ce qu'il y a des questions ?Non.Non.Ok.Et bah en tout cas je vous remercie de vous être venu etmerci tout le mondeça fait plaisir de voir ce message là.
Aucune occurrence trouvée pour « ».
00:07:41
staticmethod
00:12:52
Exception personnalisée
00:20:05
Injection / aggregation
00:21:30
Méthode privée et encapsulation
00:35:58
Parser les données de l'API
00:53:21
property : getter setter
Bravo, tu es prêt à passer à la suite