Structurer son code orienté objet
Session du 22 janvier 2022 à 18h00
Développement Web & Frameworks
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
Structurer son code orienté objet
Comment organiser son code en Programmation Orientée Objet
Présentation et explication de la fonction super
La fonction super dans un contexte avec Django
Support écrit du mentorat : https://docstring.notion.site/22-janvier-2022-d28cd110846a44d4865937b630a64003
00:00:00 :Salut Loïc aussi, je me demandais si tu allais être là, puisque là on le fait samedi.J'ai l'impression que samedi ça arrange plus de monde en général.
00:00:14 :Je sais pas si tu m'entends.Ouais ouais je t'entends.Super bien.Donc je sais pas si vous aviez vu, hop, plein de monde.Comme je disais, je pense que le samedi c'est pas mal, enfin il y a plus de monde je pensequ'ils peuvent.
00:00:33 :Vendredi soir c'est pas forcément le meilleur moment, donc je me dis que peut-être quedans le futur on gardera le samedi si ça arrange plus de monde.
00:00:44 :Alors, on va encore attendre une minute ou deux, je vais vous montrer vite fait le programme.On a pas mal de trucs ce soir.Donc oui on a pas mal de trucs ce soir, je vais déjà partager mon écran.
00:01:04 :Et aussi pour répondre à, donc il y en avait qui se demandaient s'ils pouvaient venir sansforcément parler ou intervenir, donc n'hésitez pas, bien sûr les sessions de mentora vouspouvez très bien regarder sans forcément avoir des questions à poser ou intervenirdans la discussion.
00:01:26 :A chaque fois bien sûr aussi les sessions sont enregistrées, donc si vous pouvez pasêtre là je le redis encore, mais sur docstring vous avez donc dans accompagnement, vous avezl'onglet mentora groupé et vous retrouvez donc toutes les sessions qu'on a eues avecles notes, donc vous pouvez revoir et aussi à chaque fois je chapitre, parce que comme
00:01:44 :ça dure quand même une heure, bon c'est pas forcément tout qui vous intéresse, doncje chapitre pour que vous puissiez vous exclure.Ah on est beaucoup là ce soir, aussi je vais vous demander quand vous parlez pas si vouspouvez juste couper votre micro, comme ça on est sûr qu'il n'y a pas de bruit en plus.
00:02:04 :Donc on est 9, je sais pas si il y a encore des gens qui vont arriver, donc voilà cesoir, ce qui était, donc là oui aucune session de prévue, ça n'affiche pas la session dujour, mais faudrait que je le décale.
00:02:22 :Donc Vincent je n'ai pas de micro, j'insiste donc de loin, oui donc c'est ça, pas de problèmesi vous voulez juste regarder, et n'hésitez pas si vous avez des questions à les poserdans le chat, c'est mieux dans le chat que sur le discord, parce que le discord je vais
00:02:40 :pas le regarder tout le temps.Donc n'hésitez pas à les poser, ce soir on va donc voir pas mal de choses, on va revenirsur ce que Loic avait fait, on va revenir sur l'orienter objet, on va voir pas mal depetites choses, parce qu'il y avait des bonnes questions en fait, des bonnes problématiques
00:02:57 :avec l'orienter objet, avec la façon dont on pouvait créer une instance via l'inputde l'utilisateur, et comment organiser ça de la meilleure façon possible.Donc il y a pas mal de choses que je vais vous montrer sur l'orienter objet, on va voiraussi la fonction super, ça c'était Vincent qui avait eu affaire à cette fameuse fonction
00:03:19 :qu'on voit assez souvent, qui peut aller très très loin, je vous recommande si çavous intéresse d'aller lire l'article qu'a posté Thierry je crois ici, voilà.
00:03:31 :Effectivement cet article c'est un des meilleurs articles, je trouve que ça pourrait êtreencore un peu mieux parce qu'il utilise des xyz, alors ça peut avoir des avantages d'êtreassez abstrait, et pour certains ça peut aider, des fois je trouve que quand mêmequand on a pas un exemple concret, ça peut aussi être un peu contre intuitif.
00:03:52 :C'est en anglais, alors forcément ça aide pas, parce que même si vous êtes bon enanglais, franchement dans ces trucs là c'est assez complexe, il y a les côtés MRO, c'estquand on a un héritage avec plusieurs classes, donc c'est MRO, c'est method resolutionorder.
00:04:07 :Donc c'est des trucs assez complexes, moi j'ai pas encore fait de formation sur le sujet,parce que justement c'est un peu comme le refactoring, je suis encore en train d'essayerde chercher une bonne façon de le montrer, et ça a changé aussi avec Python 3, ce quifait que c'est quand même un peu plus simple, et dans la majeure partie des cas on a pas
00:04:30 :trop besoin d'aller dans ce gros détail ici.Donc on va voir ce soir, je vais vous montrer avec les exemples que j'ai des trucs trèssimples, donc on va voir super de façon très simple, et on va voir un cas un peu plus complexeet concret par rapport à ce que t'avais Vincent avec Django, et vous allez voir qu'il y a
00:04:51 :un peu plus de choses, vous voyez ici en plus il y a des arcs, des quarks, c'est à l'intérieurd'une classe et tout, donc c'est un peu plus à l'intérieur du Django, c'est un peu pluscomplexe mais vous allez voir qu'on a pas besoin forcément, c'est un peu comme le self
00:05:05 :au début, je dirais, c'est qu'on peut l'utiliser sans forcément comprendre tout ce qui estexpliqué sur cette page, et sans sortir à 99% du temps.
00:05:13 :Je sais pas si vous aviez des questions jusque là, si vous avez des choses que vous vouliezvoir, on fera une petite partie Q&A à la fin si vous avez des questions supplémentaires,et si vous n'avez pas d'autres choses à noter là dessus, on va pouvoir commenceravec le côté orienté objet.
00:05:33 :Ça vous va? Ok.Donc n'hésitez pas bien sûr à prendre la parole, vous voyez tous mon écran, c'estbon, il n'y a pas de problème de son, tout est bon.
00:05:48 :Ok super.Parfait.Donc n'hésitez pas à intervenir, à me couper si vous avez des questions, à unmutevotre micro pour poser une question ou s'il y a un truc qui n'est pas clair.
00:06:04 :Donc on va commencer avec ce côté orienté objet, je vais aller sur celui-là, voilà.Donc on avait cet exemple, je vais revenir un petit peu en arrière.
00:06:17 :Donc il y avait Loïc, il avait son projet où on lui avait demandé d'essayer de prendrece qu'il avait fait avec les fonctions et de le passer sur une classe.
00:06:28 :Et donc on avait cette première version, et vous voyez en fait que ici, alors c'étaitmême un peu plus que ça, on avait cette première version, et effectivement on peutse dire que c'est une façon de faire avec le input, de récupérer l'input de l'utilisateuret de lui demander de rentrer des informations pour, alors là j'avais mis ajout, je vais
00:06:55 :mettre référence.Donc si on fait juste ça, je crois que j'ai entendu une question dans le chat, non c'estbon, ah il y a Nico, ok, quelqu'un d'autre qui arrive.
00:07:05 :Donc on a cette première version, si on la lance, celle-là, si je lance le programme,directement quand je veux créer une instance, on a donc ce input qui me demande quelle estla référence de l'outil et je dois donc rentrer des informations.
00:07:22 :Comme ça, position, périodicité, voilà.Donc ça marche, on peut créer comme ça une instance et avoir ensuite toutes les informationsque j'ai rentrées ici qui vont être stockées dans les attributs de ma classe, donc de cetteinstance outil dans ce cas-ci.
00:07:39 :Le problème de ça c'est qu'on est un peu bloqué parce que ça marche dans le cas oùon va demander des informations à l'utilisateur mais imaginez que ces informations on lesrécupère d'une autre source, imaginez qu'à un moment notre script il évolue et que c'estplus un utilisateur qui rentre les données à la main mais on va les chercher à partir
00:07:56 :d'un fichier CSV, d'une base de données ou quelque chose du genre.Là je suis un peu bloqué parce que mon outil, je suis obligé en l'état actuel, quand jepasse dans la méthode init en créant une instance, de passer par ces inputs et de rentrermoi-même les informations à la main.
00:08:09 :Donc c'est pour ça que mettre des inputs directement à l'intérieur d'une classec'est quelque chose qu'on voit très très rarement.Souvent ce côté de donner des informations, de donner les informations à la classe, onva le faire en dehors, soit avec une autre classe qui va agir comme on l'avait vu un
00:08:25 :petit peu la semaine dernière en sorte de manager, qui va nous permettre de gérer cesoutils, de les ajouter, et au moment de les ajouter on pourrait avoir différents modesd'ajout, on pourrait avoir une interface graphique, on peut avoir un outil en lignede commande avec input, on pourrait passer par d'autres choses.
00:08:40 :Donc c'est pour ça que généralement on sépare, parce que là mon outil je ne peuxpas le créer en rentrant des données directement.Imaginez par exemple qu'on lit un fichier CSV, que dans ce fichier CSV on récupèreune variable référence et qu'on veut la passer à notre classe.
00:08:57 :Là ce qu'on va faire en fait c'est plutôt mettre des paramètres ici dans notre méthodeinit, qu'on va passer ensuite à ces attributs.Donc là en fait on va revenir à ce que j'avais si je viens ici, voilà on va avoir quelquechose du genre, classe outils, je vais tout copier et je vais vous expliquer après.
00:09:15 :On va avoir quelque chose plutôt comme ça.Donc on a nos paramètres référence, date, position, périodicité et on passe tout çaà référence, date, position et périodicité sur notre instance.
00:09:29 :Et ce que j'ai fait à côté c'est une fonction, donc dans ce cas-ci j'ai pas besoin de plus,j'ai pas besoin de faire une classe, on a juste fait une fonction ajouter outil quielle va effectivement me demander un input pour la référence et la date, donc là c'est
00:09:41 :exactement pareil, sauf qu'après vous voyez dans ce cas-ci on va retourner une instanceen lui passant les valeurs de référence, de date, de position et de périodicité qu'ona demandé à l'utilisateur.
00:09:50 :Et donc là après si je lance mon script, dans ce cas-ci ça va être à peu près lamême chose, on me demande la référence, on me demande la date, position, périodicité,ok.
00:10:03 :Donc là ça ressemble à la même chose, sauf que là l'intérêt c'est que si jamaison veut créer un outil sans avoir besoin de le rentrer comme je viens de le faire enligne de commande, donc dans la console, on peut le faire directement comme ça.
00:10:15 :On peut rentrer la date sous forme de chaîne de caractère, vous allez vous dire c'està peu près la même chose parce que je suis en train de taper les informations aussi àla main de mon côté, mais ça il faut vous dire que ces informations on pourra les récupérer
00:10:26 :comme je vous dis d'une base de données ou de quelque chose, d'un fichier sur ledisque sans qu'on ait besoin de le taper à la main.
00:10:31 :Et donc là maintenant qu'on a reformaté notre classe pour pouvoir passer ces informationsdirectement au moment où on crée l'instance, et ben on peut le faire de cette façon.
00:10:41 :Ça va jusque là? Pas de questions? Je vais juste ouvrir le chat.Ok.Donc, ensuite, là dessus alors ce qui fait bizarre généralement quand on voit ça c'estqu'on a l'impression de se répéter, on dit souvent en programmation qu'il fautessayer de se répéter le moins possible, là on a référence une première fois, on
00:11:05 :a référence une deuxième fois qui est self.référence, et on lui dit que c'est égal à référencedonc le paramètre qu'on a ici.Donc ça fait trois fois référence, et c'est pour ça qu'on a un petit truc que je vaisvous montrer qui s'appelle les data classes.
00:11:17 :J'ai fait une vidéo sur Youtube, je vous la mettrai aussi dans les notes qui expliqueça un peu plus en détail.Donc les data classes c'est justement une façon de faire la même chose mais de façonbeaucoup plus épurée.
00:11:28 :Donc pour éviter d'avoir à répéter à chaque fois tout ça, là vous voyez on importedepuis le module data class ce décorateur data class, on le met au dessus de notre classeoutil, et là on peut créer des attributs sur notre instance en spécifiant grâce àce qu'on appelle le type hint, c'est en français, en français c'est là, j'ai plus le mot là,
00:11:52 :je sais plus, quelqu'un le retrouve et veut le mettre dans le chat, donc le type hinten fait ça permet de spécifier de quel type vont être les attributs.
00:12:02 :Et donc là vous voyez c'est beaucoup plus épuré, on a juste ce qu'il faut et on n'apas besoin de se répéter plein de fois ici.
00:12:08 :Donc les data classes ça peut être intéressant pour ça, je voulais vous le montrer, maissouvent on voit très souvent dans les scripts ce genre de choses et c'est pas un problème.
00:12:17 :Donc aussi ce que je voulais montrer à partir de ça, on avait cette fonction afficher outil,et cette fonction afficher outil vous voyez pour l'instant on a un print, donc là c'estun peu le même problème, le même écueil dans lequel on tombe, c'est que le printce qu'il va faire c'est afficher une chaîne de caractère, donc du texte, dans le terminal.
00:12:38 :Le problème c'est que ça marche quand on a une utilisation comme celle-ci, je pourraisdonc très bien créer un outil comme ça, et ensuite faire outil.afficheroutil.
00:12:48 :D'ailleurs petit truc en passant, quand vous avez un nom déjà, généralement on va enleverle afficheroutil, on va juste mettre afficher par exemple, pour éviter de se répéter.
00:12:58 :Parce que si on a déjà outil, faut voir vraiment en lecture, outil.afficher ça suffit,afficheroutil ça fait un peu répétition.Donc on va juste faire un afficher, et là effectivement si je lance mon script, je vaisbien avoir l'outil ref01, bien été ajouté à la date etc.
00:13:13 :Donc là encore dans le cadre de cette utilisation ça fonctionne, on a un print, on voit cequi a été fait, mais là encore faut penser un peu plus large, imaginez que cette informationon veut l'envoyer par email, on veut la stocker dans une base de données, on veut en faire
00:13:27 :quelque chose, bah là le print il va pas nous servir à grand chose, parce que le printil affiche, mais on peut pas le récupérer.
00:13:33 :Si j'essaie ici de récupérer résultat, bah là en fait la fonction afficher ne retournerien.Donc si je fais un print de résultat, là si vous avez fait un peu d'orienté objetvous devriez savoir ce que ça va faire, ça va me retourner none, puisque vous voyezlà ici on a none, donc on a bien le print qui s'affiche, mais si j'essaie de récupérer
00:13:49 :cette chaîne de caractère dans la variable, ça m'affiche none.Donc là ce qu'on peut faire c'est à la place du print faire un return.Donc là comme ça on va retourner la chaîne de caractère, et après cette fois ci sije veux l'afficher je peux faire un print de résultat, puisque résultat ça va récupérer
00:14:06 :ce qui est retourné dans cette méthode, et après je peux faire un print, je pourraisfaire un with open et puis ouvrir un fichier.txt, écrire dedans et puis faire comme ça
00:14:18 :as f, et ensuite on pourrait faire f.write et puis écrire le résultat dans un fichier.Donc là vous voyez on a beaucoup plus de souplesse ensuite avec cette chaîne de caractère.
00:14:27 :Et on peut aller encore plus loin, on peut utiliser une méthode spéciale qui s'appelledonc c'est les méthodes dunder, puisque il y a deux tirés du bas ici, avant et aprèsc'est un peu comme la méthode init.
00:14:39 :Donc en fait cette méthode ça va permettre de récupérer une chaîne de caractèrequand on fait un print de l'instance directement.Donc là si à la place de tout ça je fais un print de outil, je vais enlever cetteligne parce que la méthode n'existe plus.
00:14:53 :Là en fait quand on va récupérer cette instance sous forme de chaîne de caractère,que ce soit quand on fait un print, ça peut être aussi quand on va créer une chaînede caractère avec la classe string, ça peut être aussi dans, qu'est-ce qu'il y a d'autrescomme cas de figure, je sais plus, mais généralement quand on fait des choses qui vont déboucher
00:15:12 :sur une chaîne de caractère, comme un print, ça va aller chercher cette chaîne de caractèrequi est dans cette méthode spéciale.Donc là vous voyez je définis mon instance, je crée mon instance à partir de la classeet ensuite je fais juste un print, et là si je relance on a bien cette phrase qui est
00:15:27 :affichée.Et ça, ça va être fait un peu de la même façon que les dataclasses, je vais vous montrer,donc si je mets la dataclasse ici, et je vais commenter ça, sauf que la dataclasse en faitelle va automatiquement créer une autre méthode qui est la méthode rep, comme ceci.
00:15:43 :Donc pour ça si ça vous intéresse je vous mettrai les liens vers les glossaires, jevous les montrerai après, parce que c'est deux méthodes qui sont assez similaires.
00:15:49 :Donc là en faisant ça vous allez voir que je peux normalement créer ma classe de lamême façon, et si je fais un print cette fois ci, vous voyez que là on a un affichageun petit peu différent, et donc ça c'est généré automatiquement par la dataclass,et ça me permettrait en gros de recréer mon instance à partir de cette chaîne de
00:16:06 :caractère.Je vais pas trop rentrer dans les détails pour ça, je vous conseille d'aller voir dansle glossaire, il y a string et rep, j'ai fait deux glossaires assez détaillés là dessus.
00:16:16 :Qui vous expliquent justement à chaque fois les différences entre les deux, et puis vousavez du code que vous pouvez exécuter pour voir ce que ça donne.
00:16:24 :Donc n'hésitez pas à aller voir ces deux glossaires, je vais vous les mettre quelquepart là, avant que j'oublie.Donc là c'est vraiment de l'orienter objet, il y en a peut-être qui s'ennuient un peusi vous avez déjà vu tout ça, mais après c'est des notions qui sont quand même importantes
00:16:42 :à comprendre et à revoir.Après c'est des trucs un petit peu plus avancés, là ce qui est important de retenirc'est surtout cette idée que les inputs, les prints, c'est dans certains cas de figureet il faut savoir où les mettre.
00:16:55 :Donc gardez toujours en tête que le print c'est souvent quand on fait des programmesen ligne de commande.Donc si vous avez des programmes en ligne de commande vous allez souvent avoir du print,après finalement quand on fait une application Django, je pense à, si j'avais voir dansDockstring par exemple, je vais voir Dockstring ici, si je fais une recherche de print dans
00:17:19 :tout le truc, vous allez avoir des prints que je mets pour du debug, par exemple danscertains scripts, c'est des scripts que je lance en ligne de commande justement, lescheck pending etc c'est des cron jobs qui se lancent.
00:17:32 :Là j'ai fait un print, j'aurais pu faire un logger par exemple, et sinon vous voyezil n'y a pas grand chose, j'en ai quelques uns qui traînent parce que j'ai oublié pourles vimeo et tout, donc il y en a quelques uns qui traînent mais vous voyez que sur
00:17:42 :des milliers de lignes de code il n'y en a pas énormément.Et normalement il devrait même y en avoir aucun parce qu'en fait à chaque fois qu'ontravaille avec un projet Django, le print il sert à rien, c'est vraiment le fichierhtml qui va afficher des choses etc.
00:17:54 :Si on fait une application de bureau ça va être pareil, on va afficher des élémentsdans un label, dans une interface, mais en fait on ne va pas faire un print.
00:18:02 :Donc c'est vraiment quand on fait des programmes en ligne de commande qu'on va faire un printet pour ça il ne faut pas concevoir vos classes et tout ce qui tourne autour avec du print,il faut le bâtir avec de la chaîne de caractère et après une fois que vous avez la chaîne
00:18:13 :de caractère vous pouvez en faire ce que vous voulez.Est-ce qu'il y a des questions jusque là? Est-ce que c'est clair?Alors je vais aussi répondre à ta question Loïc, ce n'est pas typage de variables Vincent,c'est annotation de type.
00:18:37 :Donc oui je voulais répondre aussi à ta question que tu avais Loïc, tu me demandaisen fait comment on pouvait à partir de notre instance par exemple la sauvegarder dans unfichier ou récupérer en fait ces données comme on les a ici sous forme de dictionnairepar exemple.
00:19:01 :Parce que là en fait si on fait print outil on a accès par exemple à la date donc ona accès à tous les attributs de notre instance, donc là si je veux récupérer la date jefais print outil.date et j'ai la donnée.
00:19:11 :Le problème c'est que si on veut par exemple sauvegarder tout ça dans un fichier JSON,toi ce que tu avais fait dans les premières versions de ton script tu avais un dictionnairequi ressemblait à ça, donc tu avais le nom, la référence et ensuite en valeur tu avaisla référence, après tu avais la date en clé et en valeur tu avais la date etc.
00:19:33 :Donc là il y a plusieurs façons de faire comme souvent, il y a des façons un peu pluslongues et des façons un peu plus efficaces mais un peu plus avancées bien entendu.
00:19:43 :Donc la première façon de faire, probablement si vous commencez justement en programmationen object qui est une façon logique mais qui n'est pas forcément la plus efficacece serait de faire un truc par exemple save as JSON ou vous pouvez faire as dict par exemplepour la récupérer en tant que dictionnaire.
00:20:02 :Et donc là on pourrait tout simplement faire un return et retourner ici, hop référence,self.référence et ensuite date, self.date.Et là vous voyez on retombe un peu dans ce truc où on se répète et on dit bon benen fait c'est un peu pénible, on a l'impression d'avoir un truc qui est finalement pas très
00:20:19 :efficace parce qu'à chaque fois on doit récupérer le truc qu'on envoie quand on crée l'instance,ensuite on doit le stocker dans un attribut et ensuite quand on veut le récupérer sousforme de dictionnaire il faut recréer un dictionnaire de cette façon.
00:20:30 :Donc on a l'impression d'écrire beaucoup de lignes de code pour juste avoir la simplicitéde faire outil.date et d'avoir cette syntaxe outil.date plutôt que d'avoir ce que tu avais
00:20:41 :quand tu utilisais un dictionnaire loïc où tu faisais outil, crochet et tu allais récupérerla valeur associée à la clé date dans ton dictionnaire.Donc effectivement ça peut paraître comme un truc super compliqué avec plein de lignesde code avec de l'orienté objet pour faire quelque chose qu'on peut faire avec un dictionnaire.
00:20:56 :Mais après vous allez voir que quand on a un petit script c'est sûr que ça paraîtun peu compliqué de faire tout ça et c'est sûr que si votre script c'est juste ça,soit vous pouvez passer par une dataclasse, soit vous pouvez effectivement passer parun dictionnaire, mais souvent dans ton cas loïc je pense que le projet à terme devrait
00:21:14 :être un truc un peu plus compliqué et avec une classe l'intérêt c'est que tu peuxfaire des trucs beaucoup plus compliqués.Par exemple ta date si tu veux la récupérer sous un autre format tu pourrais faire dateas, je sais pas, alors qu'est-ce qu'on pourrait faire? On pourrait dire date formatted par
00:21:32 :exemple et après ici on pourrait faire un calcul sur la date, on pourrait par exemplerécupérer la date dans un mois, on pourrait faire plein de calculs comme ça et récupérertout ça avec des méthodes et là ce serait beaucoup plus facile de gérer notre instanceet de dire récupère moi outil add one par exemple ou outil.save ou outil.get date
00:21:56 :as US format par exemple et donc là à chaque fois on aurait des fonctions à partir denotre outil qui nous permettraient de faire des opérations.
00:22:05 :Parenthèse fermée je reviens donc sur mon dictionnaire donc là effectivement on pourraitcontinuer en faisant périodicité self.périodicité etc.Donc là si on fait ça et que je fais un print de outil.asdict on va retrouver, qu'est-ce
00:22:24 :que j'ai fait j'ai oublié un petit truc, date formaté j'en ai plus besoin, donc jerelance ça et là j'ai bien mon dictionnaire avec les informations et avec les clés etles valeurs donc c'est parfait.
00:22:36 :Et donc ça je pourrais très bien le stocker dans un fichier JSON donc pareil faire withopen data.json en mode écriture f et puis après on fera un json.dump de tout ça.
00:22:52 :On va très bien faire ça, import json et voilà on pourrait sauvegarder donc notreoutil en tant que dictionnaire dans notre fichier JSON.Donc ça c'est une façon de faire, une autre façon de faire, je vous la laisse ici, uneautre façon de faire qui est une façon que j'aime mieux personnellement c'est en fait
00:23:11 :d'utiliser un truc un peu caché qui s'appelle là encore avec le dunder donc cet attributdict qui va directement vous retourner tous les attributs de votre instance sous formede dictionnaire.
00:23:25 :Donc si je fais print outil.e-dict comme ceci, je le lance et là vous voyez on retrouveexactement la même chose.Le petit problème de ça, ça peut être qu'en fait on va tout récupérer.
00:23:40 :Imaginez ici je rajoute un truc, on va dire je sais pas a égale 5, on va faire un tructout con, bah là je vais le récupérer également.
00:23:47 :Vous voyez là j'ai bien a qui est 2.5.Donc c'est un peu le problème de dict en fait c'est qu'on va tout récupérer, aprèsce qu'on pourrait faire ici, ça dépend de l'approche en fait, là vous voyez qu'onretourne, enfin on a 4 éléments dedans donc c'est un peu long de tout taper à la main.
00:24:03 :Donc là ce qu'on pourrait faire si on voulait pas avoir le 1, c'est dire par exemple dataégale self point dict et ensuite on pourrait dire data point ou del data et on enlèvela clé qui correspond au a.
00:24:17 :Et on retourne data.Là vous voyez finalement on récupère tous les attributs de notre classe, on lui ditjuste que le a on en a pas besoin et ensuite on retourne le data.
00:24:28 :Donc là si je relance et que je fais as dict, je relance et là on se retrouve bien avecuniquement ce dont on a besoin.
00:24:37 :Donc vous voyez plusieurs façons de faire la même chose, moi j'aime bien le dict parceque justement imaginez là on en a 4 donc ça va encore mais imaginez que vous ayez40 trucs comme ça, avec le dict c'est un peu plus facile de récupérer tout ça directement.
00:24:52 :Donc je sais pas si Loïc ça te permet de voir un peu une façon de récupérer finalementsous une autre forme ton instance.Oui ça me permet de me projeter, c'est bien ce que t'as fait avant là, où tu donnesdes exemples justement pour…Oui, outils.save, outils.tout ça.
00:25:15 :Après c'est un truc qui est très cool aussi, c'est les propriétés, alors là encorec'est des trucs qui sont un petit peu plus avancés mais qui sont très pratiques, c'estque en fait les propriétés c'est quand on met un décorateur at property comme ça,là tu vois par exemple tu pourrais dire qu'est-ce qu'on va faire, imagine on va dire référence
00:25:41 :cleaned, on va faire un truc un peu à la Django, je dis ça pour toi Vincent parceque je sais que t'es dans les formulaires avec les cleaned partout, on va dire mêmecleaned reference, donc là tu vois on pourrait faire un truc en disant if self.reference.start
00:25:58 :suite, donc si ta référence elle commence avec ref, tu retournes self.reference, etsinon tu retournes ref plus self.reference, on pourrait le faire avec un fstring aussi,
00:26:10 :là je fais un truc rapide, et là en fait quand on met un at property qu'est-ce queça permet de faire, tout simplement ça permet de l'appeler comme un attribut, donc en faitje peux faire outil.cleaned.reference comme ça et j'ai pas besoin de mettre les parenthèses,
00:26:24 :si j'enlève le at property en fait je suis obligé, ça devient une méthode, donc uneméthode classique comme une fonction, et donc là je suis obligé de mettre les parenthèsespour l'appeler. Et quand je mets un property, l'intérêt c'est que là en fait ça c'est,
00:26:37 :tu vois on fait un petit calcul ici, et donc imagine là quelqu'un il oublie de mettrela référence, donc il met juste 0.1 et il oublie de rajouter le ref devant, là ça
00:26:46 :va le mettre automatiquement, ouais là ça va regarder et si en fait ça commence avecref, ça retourne tout simplement la chaîne, et sinon ça rajoute le ref devant, et donclà si je relance le truc, tu vois j'ai bien ref.0.1, et si par contre, enfin si je mets
00:27:00 :ref, ça va être ref.0.1 aussi mais ça va juste passer dans ce if au lieu de ce return,donc t'es assuré que voilà t'auras toujours le ref devant.
00:27:09 :Bah c'est top ça.Tu vois c'est des petits trucs comme ça, où là avec un dictionnaire tu vois ce seraitun peu plus compliqué parce que le dictionnaire forcément tu peux pas, le dictionnaire c'estvraiment un truc pour stocker des informations, donc là quand tu fais outil.référence c'est
00:27:23 :parfait, mais après tu vois tu pourrais pas dire outil.référence et après faire.getou quelque chose, tu vois ça reste juste un outil de stockage de données, de représentationde données, et l'orienté objet c'est vraiment t'as un objet sur lequel tu peux avoir desattributs, des méthodes, et tu peux faire des trucs beaucoup plus complexes.
00:27:42 :Donc voilà, petit exemple comme ça pour montrer.Mais le premier modèle tu l'avais testé? Le premier modèle?Tu sais le projet qu'on avait fait avec Martin, avec tout ce qui était livré, est-ce quetu l'avais lancé et testé? Oui oui oui.
00:27:59 :Ouais? Parce qu'il y avait quand même la possibilité de faire quelques petites opérationsquoi.Oui c'est sûr, mais après tu vois c'est que c'est au niveau aussi de la gestion, parcequ'après tu vois les dictionnaires par exemple, dans votre cas vous commenciez à avoir pasmal de trucs imbriqués, et c'est là où ça devient assez compliqué parce que tu,
00:28:22 :aussi au niveau de la lecture du code, dans votre code tu vois il y avait beaucoup delignes de code pour finalement faire quelques opérations.
00:28:30 :Alors que là tu vois en plus si on va avec les data class, tu vois avec 4-5 lignes decode t'as déjà une classe qui est bâtie sur laquelle tu peux faire des choses, etaprès c'est ça, c'est différentes façons de faire les choses, on pourrait très bientout faire avec des dictionnaires et tout, mais c'est juste que c'est quand même une
00:28:47 :façon plus avancée de représenter des données complexes quoi.Et puis de toute façon au bout d'un moment on n'aura plus le choix.Oui après ça veut pas dire non plus qu'il faut, tu vois, si des fois comme je disais,si t'as vraiment un truc où, pour donner un exemple, voilà un bon exemple, sur le
00:29:05 :serveur public de Dockstring, on a un système de points quand les gens ils aident qui permettentde récupérer les points, donc tu vois là pour stocker ça, c'est vraiment le cas defigure où j'aurais pu partir dans une base de données PostgreSQL avec un truc supercompliqué avec des classes, et finalement qu'est-ce que j'ai fait? Bah en fait j'ai
00:29:25 :fait juste un dictionnaire avec en clé le ID des gens sur Discord et en valeur le nombrede points qu'ils ont.Donc tu vois là j'avais pas besoin de faire une classe, j'aurais pu faire une classe genreuser avec juste un attribut point etc, mais là j'aurais fait 10 lignes de code pour juste
00:29:42 :avoir ce que je peux très bien faire avec un dictionnaire.Donc tu vois faut pas non plus se dire à chaque fois je vais partir sur une classedans tous les cas de figure.
00:29:49 :C'est vraiment, ça dépend, c'est adapté.Là dans ton cas tu vois avec un outil il y avait vraiment ce côté là, l'outil, lecôté gestion des livraisons, c'est vraiment un truc qui de base était assez orientéobjet, donc c'est pour ça que ça faisait du sens de partir là dessus.
00:30:02 :Est-ce que je regarde s'il y a des petites questions? Ok.Donc voilà pour la partie un peu orientée objet, method string c'est bon, j'ai montréinput, donc voilà pour le côté orienté objet, je sais pas si c'est là que j'aivu qu'il y a Vincent, je sais pas quel Vincent, est-ce qu'on avait deux Vincent? Et il y
00:30:28 :a un Vincent qui est parti, et je sais pas, ok on va peut-être attendre une minute oudeux parce que c'est surtout, bon après il verra s'il est parti, s'il a un problèmeavec son Mac, parce que c'était Vincent qui avait posté cette question sur la fonctionsuper, donc je vais attendre une minute ou deux pour voir s'il revient.
00:30:48 :Est-ce qu'il y avait des questions là dessus, le côté orienté objet? Ou ça va? Jevais vous mettre sur mon… Par contre la suite ça va concerner plus Django et…Ouais, après oui et non, en fait on a cette partie qui est quand même intéressante jepense, alors on est encore dans l'orienté objet, et… Je veux pas, juste j'ai pas
00:31:17 :envie d'aller, j'ai pas envie de me perdre, tu vois, tu as mis chemin de la formationet… Oui oui, non mais pas de soucis, après lafonction super, cet exemple là peut être quand même intéressant, parce que je penseque ça résume bien le truc de façon assez simple, et je pense que même pour toi Loïc,
00:31:40 :tu vois même si t'es pas rendu là, même si c'est des cas de figure que tu vas probablementvoir un peu plus loin dans l'orienté objet, ça peut te faire une première introductionà super qui va te permettre de l'avoir vu quand même, et quand tu tomberas dessus sur
00:31:52 :les formations tu l'auras déjà vu et ça ira peut-être mieux.Ok bah c'est clair. Donc Vincent c'est bon, t'as pu revenir?Et les dataclasts sur docstring? Ouais non pas de soucis, sur docstring vous
00:32:09 :voyez c'est la question que je me posais, je sais même plus si je l'avais mis, je vaistaper dataclast, ouais ça y est, donc oui je l'avais rajouté dans l'orienté objetles bases, donc c'est la vidéo en fait que j'avais fait sur Youtube, alors c'est pas,je vais pas vraiment dans le détail mais j'explique donc un peu tout ce que je vous
00:32:24 :avais expliqué, vous voyez avec le rep qui est fait automatiquement, je vais un petitpeu plus loin aussi dans la vidéo pour vous montrer des trucs qu'on peut faire, mais lesdataclasts oui c'est un truc qui est assez nouveau, c'est depuis la version 3.17 si je
00:32:40 :me trompe pas, c'est quand même très pratique parce que ça évite pour des petits cas commeça, tu vois c'est peut-être ça ou là le hic, même pour des petits cas de figure,ça peut être intéressant avec les dataclasts de quand même passer par une classe parceque c'est quand même, c'est pratique, c'est pratique tu vois cette notation de points
00:32:59 :il y a quand même ce côté appartenance et tout et c'est pratique de pouvoir faire ça.Et avant on avait aussi, qui est encore un petit peu utilisé, ce qu'on appelle les enums,qui est un raccourci pour enumeration je crois, je suis même pas sûr, et c'est python enum,
00:33:14 :c'est en fait, oui c'est ça, enumération, c'était une façon un peu similaire vousvoyez de faire des, voilà, vous voyez on fait une classe couleur et après on peutfaire color.red et puis ça va nous retourner une valeur qui est associée à cette, vous
00:33:30 :voyez par exemple shake vanilla et puis ça va retourner 7, 4, 9 etc. Donc voilà c'estun peu un autre, finalement c'est un peu comme un dictionnaire si vous voulez améliorer,donc une autre façon encore de représenter les données, après les enums c'est vraiment,ça va pas très loin quoi, c'est assez basique, les dataclasts c'est quand même une classe
00:33:53 :qui vous permet, vous voyez, de faire des méthodes et des trucs un peu plus complexes,et puis après si vraiment vous avez des classes très complexes avec plein de méthodes, pleinde choses du genre, généralement on va repasser sur un truc assez classique avec du init,parce que dans le init ça se peut qu'on ait beaucoup plus de choses que juste l'assignation
00:34:09 :comme ça de paramètres dans des attributs. Par exemple on pourrait dire, quand tu créesun outil, à chaque fois qu'on passe dans la méthode init et qu'on crée une instanced'un outil, on va envoyer un mail à quelqu'un pour lui dire, il y a un nouvel outil quia été créé, tu peux commencer à travailler. Vous voyez ça pourrait être un exemple de
00:34:24 :choses qu'on met dans une méthode init, ou des choses comme ça qui vont se faire aumoment de créer l'instance. Donc on va revenir sur, hop, le, je vais cacher ça, donc on
00:34:38 :va revenir sur super avec cet exemple, super exemple, voilà, donc j'ai fait un truc assezsimple, j'ai une classe que j'ai appelée, alors c'est très abstrait, mais je voulaisgarder un truc très simple pour pas vous mélanger. Donc vous voyez j'ai fait des prints
00:34:55 :en fait pour représenter des actions et puis en fait bon bah ça fait rien, forcémentc'est juste des prints mais ça va vous permettre de voir qu'est-ce qui est affiché et puisl'intérêt de super. Donc on a une classe qui s'appelle Saver avec une méthode Save
00:35:09 :qui va faire, voilà, qui va afficher le début de la sauvegarde et je considère qu'à chaquefois qu'on fait une sauvegarde on veut envoyer un mail justement qui va alerter les équipesde production. Et ensuite j'ai une classe File qui hérite donc de cette classe Saver
00:35:22 :qui elle aussi a une méthode Save. Et dans cette méthode Save je fais un print en disantsauvegarde du fichier sur le disque et on pourra dire encore, voilà. Donc là le truc
00:35:32 :c'est que quand on hérite en fait, vous, ceux qu'on fait, qui ont vu un peu les trucsd'orienter objet, vous devez savoir que si on hérite, si j'enlève tout ça par exemple,bah là je peux faire File.Save. Parce qu'en fait ce qu'il va faire Python c'est que quand
00:35:45 :on hérite de Saver il va aussi hériter des méthodes en fait qui sont définies à l'intérieurde la méthode, de la classe pardon, dont on hérite. Donc en fait ce qu'il va faire là
00:35:54 :si je fais un File.Save il va regarder dans la classe la plus proche, donc là on a faitune instance à partir de File, donc il va regarder dans cette classe est-ce que j'aiune méthode Save. Là c'est pas le cas, donc ce qu'il va faire c'est qu'il va remonter
00:36:07 :dans les parents, il va dire bon ok tu hérites de Saver, donc je vais aller voir dans Savers'il y a une méthode Save, et là c'est le cas et donc il va appeler celle-ci. Le
00:36:16 :problème c'est que là si on fait une méthode Save ici, en fait on est en train d'écrasercelle qui est ici. C'est pas tant qu'on l'écrase, c'est plus que Python vraiment dans sa façon
00:36:25 :de voir les choses, il va dire ok on crée une instance à partir de File, donc quandje fais File.Save je regarde déjà dans la classe la plus proche, donc la classe à partir
00:36:34 :de laquelle on a créé notre instance, est-ce que j'ai une méthode Save. Là c'est lecas, donc il va exécuter ce qu'il y a dans la méthode Save, et il va pas remonter dansles parents pour exécuter ce qu'il y a dans les méthodes parents. Donc là si je lance
00:36:45 :ça actuellement, qu'est-ce que ça va m'afficher? Est-ce qu'il y en a qui ont des idées? Petitquiz. Selon vous, est-ce que ça va m'afficher ça, est-ce que ça va m'afficher ça, ou
00:36:59 :est-ce que ça va m'afficher tous les prints? Pas sûr. On va lancer. Super exemple, sije lance ça, là on a juste le print, parce que comme je vous dis, il va juste se direok j'ai une méthode qui est définie ici, donc j'exécute cette méthode, et je remonte
00:37:29 :pas la chaîne de dépendance ici, je vais pas aller voir dans Saveur pour l'exécuter.Le problème c'est que nous dans ce cas-ci, on veut juste augmenter si vous voulez laméthode de base. On voudrait bien que ça exécute déjà ce qu'il y a dans la méthode
00:37:44 :parent, et qu'ensuite ça fasse le truc qui est spécifique à cette classe. Puisque làimaginez on a un truc pour les fichiers, mais après on pourrait faire une classe Databasequi est ReadTheSaver aussi, et là c'est juste une façon d'éviter de répéter du code.
00:37:59 :Parce que là on pourrait dire sauvegarde de la base de données sur le disque. Donclà en fait ce qu'on veut c'est éviter d'avoir à répéter ces étapes ici à chaque fois,pour pas avoir à faire les deux prints à chaque fois comme ça. Ce qu'on fait c'est
00:38:14 :que comme on a les mêmes étapes ici et ici, on fait une classe générique qui s'appelleSave, qui à chaque fois qu'on veut faire un Save, ça va afficher le début de la sauvegardeet ça va envoyer un mail pour alerter les équipes. Et nous ce qu'on veut faire c'est
00:38:28 :juste quand on est dans une base de données, alerter les gens et ensuite sauvegarder labase de données. Donc là ça va être un processus qui va être différent du fichier,
00:38:35 :et sur le fichier c'est pareil, on veut déjà alerter les équipes et ensuite sauvegarderle fichier. Donc là le problème que j'ai actuellement avec ces deux classes c'est que,
00:38:42 :si je reviens juste sur cette classe, c'est que comme on écrase en quelque sorte, enfinon fait une méthode qui s'appelle pareil que celle-ci, et bien on va juste exécutercelle-ci. Donc ce qu'on va faire, alors il y a différentes façons de faire, vous avez
00:38:53 :les trois cas de figure ici. La première façon de faire, sans Super, juste comme ça,c'est de dire on va appeler tout simplement la méthode du parent. On va dire Saver, et
00:39:04 :là je dis du parent mais ça pourrait être autre chose, on pourrait avoir une autreclasse qui s'appelle Super Saver et puis on pourrait l'appeler aussi. Là en fait
00:39:11 :on appelle juste la méthode de la classe de laquelle on hérite. Et donc là ce queje fais c'est que je fais Saver.save, je lui passe mon instance parce que sinon il
00:39:22 :va pas être content parce que là on a besoin d'une instance qui est du self, et là cequ'il va faire c'est qu'il va donc déjà exécuter celle-ci, puisque là c'est cequ'on fait, on appelle Saver.self, et après il va exécuter mon print. Donc là si je
00:39:33 :relance mon script, on a début de la sauvegarde, envoi du mail et sauvegarde du fichier. Maintenantce qu'on fait généralement, alors là je vous ai mis la façon Python 2 puisque çaa changé entre Python 2 et Python 3, alors là vous voyez j'avais changé, hop, justefile. Avec Python 2 en fait on est obligé de mettre le nom de la classe, donc l'intérêt
00:39:54 :en fait ici c'est que par rapport à la première façon de faire, imaginez que finalement vouschangez le nom de cette classe, et justement on l'appelle Super Saver. Ca veut dire qu'il
00:40:05 :faut le changer à pas mal d'endroits, parce qu'on va devoir le changer ici et on va égalementdevoir le changer ici. Donc Super, ce que ça nous évite de faire c'est que, en fait
00:40:14 :avec Python 2 on devait faire ça, donc vous allez le voir des fois, vous allez voir Superet en premier on passe le nom de la classe ici, en deuxième on passe l'instance et ensuiteon dit quelle méthode on veut appeler. Et là en fait ce qu'il va faire c'est que lui
00:40:26 :avec ce Super, il va remplacer en fait ça par la classe de laquelle on hérite. Doncen fait tout ce truc là c'est comme si vous aviez Saver. L'avantage c'est que si finalement
00:40:36 :on change la classe ici, on met Super Saver, on a juste à changer notre héritage làet on n'a pas à changer tous les Supers qu'on pourrait avoir dans les dizaines de méthodesqu'on utilise. Le seul problème c'est qu'avec cette façon de faire, si jamais on changeait
00:40:51 :la classe ici, donc si on appelait Super File, là on devait quand même changer Super Filedans le Super. Donc c'est pour ça qu'avec Python 3 en fait ils ont simplifié le truc
00:41:00 :et maintenant on n'a même plus besoin de faire ça en fait, on appelle directementSuper avec les parenthèses et là en fait il va s'occuper de, si on peut changer çaici on pourrait mettre Patrick et là vous voyez ça change rien ici. Bon il faut le
00:41:12 :changer ici quand on crée l'instance bien sûr mais au niveau des Supers on n'a rienbesoin de changer. Donc là vous pouvez changer le nom de la classe, le nom de la classe
00:41:18 :dont vous héritez et avec cette syntaxe tout reste cohérent. Et donc si je reviens surmon exemple, sans le Super, donc je fais mon Super Saver, je vais enlever ça ici, je vaisrevenir, juste Saver, donc là si je reprends mon exemple, j'exécute et on a juste leprint ici. Donc moi ce que j'aimerais c'est pas remplacer la méthode ici mais c'est
00:41:47 :la surcharger, l'augmenter, donc déjà appeler ça ici, Super.Save et ensuite fairela sauvegarde du fichier sur le disque. Donc si je relance là on a bien les trois trucs.
00:41:56 :Et vous voyez que l'ordre a une importance aussi parce que si je fais déjà mon printet qu'ensuite je fais Super.Save, bah là on va déjà faire la sauvegarde du fichier
00:42:03 :et ensuite on fait début de la sauvegarde et on envoie du mail. Donc l'ordre a uneimportance et là je vais faire la transition sur l'exemple Django. Ce qu'on peut voir
00:42:14 :des fois, ce qu'on peut voir dans la documentation de Django par exemple, c'est ça. On peutfaire un return de Super.Save. Donc là qu'est-ce qu'on a fait? Bah en fait rien, parce qu'on
00:42:23 :fait juste retourner l'appel à la méthode parent. Donc là si je lance ça, on va avoirles deux prints qui s'affichent et on fait rien du tout. Mais on pourrait se dire bon
00:42:32 :bah finalement je veux modifier le comportement et donc là c'est ça qu'on va voir tout desuite avec l'exemple Django. On pourrait se dire entre les deux je veux faire quelque
00:42:41 :chose. Donc je veux quand même avoir le comportement par défaut mais juste avant je veux fairequelque chose. Et ça on le voit notamment dans Django quand on fait un save on pourrait
00:42:49 :dire bah sauvegarde-moi le modèle dans la base de données mais avant tu fais quelquechose. Par exemple tu vas mettre un slug et tu vas dire slugify, je pense que je l'avais
00:42:57 :montré dans une session de mentora précédente, self.title. Voilà on pourrait dire avantde faire la sauvegarde sur le disque ou dans ma base de données, tu rajoutes un slug surmon modèle. Donc ça permet de garder le comportement par défaut et juste insérer quelque chose
00:43:12 :au milieu. Ok, est-ce que ça va?Ouais c'est plus clair en tout cas.Ouais c'est plus clair?Ouais ouais.Ok.Mais je ne le voyais pas en fait, c'est un complément du classement. Je ne l'avais pas
00:43:30 :considéré comme ça.Oui bah en fait on ne le voit pas trop justement dans, en fait c'est pas ça.Là en tout cas avec l'exemple que tu as mis c'est beaucoup plus parlant.
00:43:39 :Oui mais là du coup moi je vous conseille d'aller voir ça, je réfléchis, si je l'expliquedans orienter objet avancé, voilà la fonction superbe et la surcharge et le polymorphisme.
00:43:55 :Je vous conseille vraiment l'héritage, voilà, toute cette partie là. Je reviens vraimentlà-dessus, tu vois tu as un utilisateur, tu as un junior qui hérite de l'utilisateuret puis après justement je montre comment tu peux avoir différentes choses. Si je vais
00:44:11 :un peu plus, hop, la surcharge, voilà c'est ça, c'est partie ici. Tu vois en gros jemontre qu'un utilisateur de base en fait il peut afficher tous les projets et un utilisateurjunior il va juste pouvoir afficher certains types de projets. Donc là tu vois tu peux
00:44:33 :avoir des comportements différents et là tu vois on ne fait pas de surcharge parcequ'on veut que justement cette méthode d'afficher projet elle soit différente de celle de l'utilisateurnormal donc là on ne veut pas appliquer le comportement par défaut donc on fait vraimenton l'écrase en gros. Par contre après dans le polymorphisme là tu vois on va avoir différentes
00:44:51 :choses et là cet exemple avec le véhicule c'est exactement ce que je viens de vousmontrer avec d'autres choses donc vraiment je vous mets le lien, je vais vous le mettreaussi dans les notes. Je vous conseille d'aller voir ces 4 vidéos là c'est pas très long
00:45:03 :et ça va revenir bien en détail sur tout ce que j'ai expliqué là. Ok, alors est-cequ'il y avait des questions là dessus, d'autres questions? Ça va? Donc tu vois le hic
00:45:19 :t'en fais pas trop là, on rentre dans les trucs ou justement l'héritage etc. Mais jepense que ça peut donner juste sur le côté réutilisation du code aussi tu vois que d'avoirune classe, là encore on est toujours un peu dans cette idée d'essayer de le pluspossible de moins répéter les choses et donc quand on commence à avoir des choses
00:45:37 :comme ça qui se répètent, le fait d'avoir une classe de base qui permet après d'utiliserle même code et de faire des classes qui hérite de tout ça, ça permet d'avoir untruc qui est beaucoup plus robuste. Ok. C'est parfait, merci beaucoup. Pas de soucis. Donc
00:45:54 :là je vais vous montrer cet exemple avec Django, donc là je ferme ça. Par contremoi je vais vous quitter, je vous souhaite une bonne continuation, bonne soirée. Pas
00:46:04 :de soucis, merci, ciao ciao. Ciao. Donc je reviens sur Django, donc là vous voyez j'aifait un truc, c'est vraiment très très très simple, j'ai une page qui affiche leblog et qui affiche un article de blog qui est dans ma base de données. Donc pour ceux
00:46:25 :qui n'ont pas vu Django, je vais essayer de, enfin je pense que l'exemple peut êtreun peu plus parlant sur l'utilisation de Super même si vous ne connaissez pas Django,et pour ceux qui ont vu Django, forcément ça va être un peu plus parlant, surtouttoi Vincent qui était en plein dans les CBV, les class-based view. Donc là en fait j'ai
00:46:48 :tout simplement une vue, c'est home view, donc c'est cette vue qui va afficher, quiva retourner cette page HTML dans laquelle vous voyez j'affiche un titre, donc le titreici c'est le blog, et ici en fait je boucle sur les articles et j'affiche le titre dechaque article. Donc là j'ai juste un article ici qui s'appelle un super article. Et donc
00:47:06 :en fait dans ces CBV, donc CBV comme ça, ces vues basées sur les classes, à chaquefois en fait on va hériter d'une classe qui existe, qui est créée par Django etqui comporte pas mal de choses. Et moi je vous conseille, et vraiment Vincent je le
00:47:21 :montre dans les formations, mais vraiment c'est un conseil que je vous donne de toujoursaller explorer le code source de Django parce que c'est très intéressant en fait et onen apprend énormément. Et donc si je fais, et y'a pas de magie en fait, c'est ça
00:47:33 :qui est marrant, c'est que quand on regarde la documentation des fois la documentationelle vous dit justement si vous voulez changer le contexte, vous utilisez cette méthodeet vous faites ça et on comprend pas trop forcément pourquoi. Mais si on va explorer
00:47:46 :donc la liste vue, donc sur PyCharm vous pouvez faire ctrl B, commande B, clic droitsinon vous allez dans go to declaration or usage, ça c'est un des raccourcis que j'utilisele plus, donc si je fais commande B tu vois ça va m'ouvrir dans les fichiers de Django,donc là on le voit avec la couleur un petit peu différente, on est dans un fichier qu'on
00:48:06 :est pas censé toucher, donc là commencez pas à aller faire des trucs, vous voyez d'ailleursje l'ai fait un peu rapidement mais si vous commencez à écrire quelque chose en faity'a un pop-up qui vous dit attention t'es en train de toucher un fichier qui est pasdans ton projet, donc fais gaffe et il te demande si tu veux autoriser l'édition. Donc
00:48:21 :là j'ai fait un peu, j'ai appuyé sur entrée deux fois donc vous l'avez pas vu, mais y'aune protection comme ça. Et donc là en fait vous voyez c'est ce que disait Thierry sur
00:48:31 :le serveur, c'est que là vous voyez qu'on commence à avoir de l'héritage multipleet c'est là où ça peut commencer à devenir complexe avec Super parce que comme on l'avu dans l'exemple que je vous ai montré, quand on a un seul parent c'est assez simple,y'a pas trop de choses à se demander, il va juste regarder dans le parent et c'est
00:48:47 :tout. Quand on commence à avoir plusieurs parents comme ça, bah là il commence ày avoir des problématiques de quelle chose on fait en premier. Donc est-ce que si par
00:48:56 :exemple cette classe et cette classe elles ont une méthode save, est-ce que j'appellecelle-là, ensuite celle-là, et puis après la méthode save de mon ListView, ou est-ceque je fais déjà le ListView et ensuite celle-ci, ensuite celle-ci, ou est-ce queje fais celle-ci, celle-ci, enfin vous voyez ça commence à faire des trucs et c'est
00:49:10 :le fameux MRO, c'est le Method Resolution Order. Donc c'est dans quel ordre il va résoudrecette équation, est-ce qu'il appelle celle-là avant celle-là, etc. Et là ça peut rentrer
00:49:22 :dans des trucs assez complexes et c'est de ça dont parle l'article, voilà celui-là,ou je sais pas si on l'a, MRO, quelque part, voilà MRO, où il va dire dans quel cas defigure on va, dans quelle classe, etc. Je vais pas rentrer trop dans les détails là-dessus,
00:49:38 :mais juste pour revenir ici, vous voyez que ListView ça hérite de BaselistView, et sije viens là-dessus, vous voyez que là en fait BaselistView on a la méthode Get eton a le contexte avec cette fameuse méthode GetContextData. Donc en fait quand on fait
00:49:51 :une requête Get sur une page, donc quand je reviens sur ma page ici, quand je faisune requête sur la page, donc par défaut c'est une requête de type Get, en fait ilva passer dans cette méthode ici, Get, et qu'est-ce qu'il fait ici? Il récupère
00:50:04 :ObjectList, et tiens, c'est pas étonnant puisque ObjectList c'est ce qu'on peut utiliserdans le template. Donc vous voyez là on retrouve des choses, dans la documentation, si vous
00:50:13 :allez voir, je sais plus si je l'ai ici, non? Mais dans la documentation, si vousallez voir la documentation des ListView, ils vont vous dire bah dans ton template icitu peux utiliser ce nom ObjectList, et il faut précisément qu'il s'appelle ObjectList,si j'oublie le tiré du bas ça marchera pas, et donc pourquoi il faut utiliser ça? Et
00:50:28 :bien tout simplement parce que quand on va fouiller un peu dans le code on se rend compteque quand on fait une requête Get, bah il va récupérer ObjectList avec le GetQuerySet.
00:50:36 :Si vous voulez savoir GetQuerySet qu'est-ce que c'est, bah là encore Command-B, et doncGetQuerySet qu'est-ce qu'il fait? Bah il va aller récupérer notre self.model, et
00:50:45 :self.model c'est ce qu'on lui a passé ici, modèle on lui dit que c'est blog post.Donc dans ce cas-ci en fait il va tout simplement aller récupérer le manager par défaut dumodèle et il va aller récupérer tous les éléments de notre query set. Donc vous voyez
00:50:59 :faut pas hésiter à aller fouiller là-dedans, et si je reviens donc un petit peu en arrièrepour revenir dans le Get, donc dans le Get vous voyez qu'il va chercher le context data.
00:51:08 :Et le context data vous voyez en fait il va tout simplement ajouter des choses là-dedans,il va, c'est un dictionnaire en fait le context, et il va, là vous voyez il fait un retournesuper de GetContextData, donc quand vous voyez super ça veut dire qu'on hérite de quelquechose, parce que là en fait il va passer ce context à la méthode GetContextData de
00:51:29 :super. Donc super c'est quoi dans ce cas-ci? On remonte, on remonte, et on va voir qu'onest dans cette classe MultipleObjectMixin et qu'on hérite de ContextMixin. Donc là
00:51:39 :ça veut dire que dans ContextMixin je suis sûr qu'il y a un GetContextData. Et si jereviens là-dessus, magie, qu'est-ce qu'il y a? Il y a juste cette méthode qui s'appelle
00:51:48 :GetContextData et qu'est-ce qu'elle fait? Et bien c'est juste une méthode qui prendun dictionnaire, qui sette des valeurs par défaut et qui retourne ce dictionnaire. Donc
00:51:55 :là ce qu'on fait c'est qu'en fait on a besoin de cette, enfin si on veut avoir cettevue ici dans notre dictionnaire, ça veut dire qu'ici dans GetContextData, lui vousvoyez dans ce cas précis il rajoute plein de choses, il rajoute un paginateur, il rajoutele fameux ObjectList qui est égal à notre QuerySet, qui est égal à ce fameux SelfObjectList,
00:52:16 :donc là vous voyez encore il n'y a pas de magie. Et il met tout ça dans notre contexteet il va updater, donc il va rajouter dans notre dictionnaire tout ce qu'il avait ettout ce qu'il a défini ici. Et on va récupérer ce qu'on avait dans la méthode parent et
00:52:32 :on le retourne. Et donc nous, vous voyez en fait ça peut paraître très complexe, ily a probablement plein de gens qui sont perdus qui disent oh là là mais attend est-ce qu'àchaque fois il faut que je retourne, que j'aille voir tout ça? Non vous n'avez pas besoin,
00:52:43 :c'est juste pour vous montrer qu'il y a déjà beaucoup de codes qui existent et tout çapour vous dire en fait que quand je reviens ici, si je fais juste ça ici, si je faisjuste retourner un dictionnaire en disant titre et que là je mets le blog, donc là
00:53:02 :ce que je fais c'est que je retourne un dictionnaire mais je n'utilise pas super. Donc là je vaisvraiment écraser tout ce qui est défini ici, tout ce qui est défini dans ma classe ListViews'est écrasé. Donc tout ce qui est fait dans cette méthode GetContextData et tout
00:53:16 :ce qui est fait dans la classe parent, donc dans la base ici, il n'y en a plus. Donc çaveut dire que le fameux ObjectList qui était ajouté dans mon contexte, dans mon dictionnaire,je n'y ai plus accès. Et moi ce que je fais ici c'est juste retourner un dictionnaire
00:53:29 :tout simple avec le titre et le blog. Donc ça veut dire que ici le titre je vais pouvoirl'afficher mais l'ObjectList il ne sera plus là. Donc si je reviens là, j'actualise,
00:53:38 :vous voyez que le titre il est toujours là, je le passe explicitement, mais mon articleil n'est plus là. Donc moi ce qu'il faut faire c'est récupérer, donc c'est ce que
00:53:48 :j'avais fait ici avant, c'est à dire qu'il faut déjà utiliser Super pour aller appelerGetContextData de la classe dont on hérite. Donc là on va déjà exécuter cette méthode
00:54:01 :de ListView. Donc dans ListView il va passer à travers tout ça, il va récupérer toutesles informations, il va aller récupérer ce qu'il y a dans la base, il va nous faireun bon gros dictionnaire avec tout ce qu'on a besoin dedans, donc le ObjectList, le Paginatorsi on avait un système de pagination etc. Et moi ce que je fais après, je récupère
00:54:19 :toutes ces informations dans une variable Context, et là vous voyez qu'en allant fouillerlà-dedans on peut déjà savoir que c'est un dictionnaire parce que là on se rend compteque voilà Context c'est un dictionnaire. Donc je récupère ce Context qui est un dictionnaire
00:54:32 :et je fais juste ajouter une clé titre qui a une valeur le blog à ce Context et làje retourne le Context. C'est à dire qu'à ce moment là mon Context il a déjà plein
00:54:40 :de choses dedans et je fais juste rajouter quelque chose dedans. Et si j'actualise cettefois-ci, hop on retrouve bien un super article. Ok? Alors, est-ce que ça va? Je suis allé
00:54:56 :un petit peu vite peut-être? Ouais ouais je sais pas aller dans le détailmais en fait moi ce que j'ai compris à la fin, enfin j'ai compris cette semaine enle faisant, c'était parce que moi si j'affichais les résultats de la requête dans le template,c'est ce Context là qui te permet de choisir le nom que tu veux pour le mettre dans le
00:55:14 :template. Dans le get ici? Non en gros le Context titre, c'est le mot titre que tuvas utiliser pour l'afficher dans le template. Oui oui oui c'est ça, c'est ce que j'utilise
00:55:26 :ici tu vois titre. Et ça c'est en fait la même chose, alors si vous avez fait desFBV pour le coup, des Function Based View, là je pourrais faire quelque chose du genreet là je pourrais aller récupérer justement mes articles et dire blogpost.object.all et
00:55:46 :faire un return render et retourner, donc là dans ce cas-ci, la requête, le blogslash blogpost list.html, et là en fait je peux passer directement le contexte comme
00:55:58 :ça. Et donc là je pourrais dire article et article. Donc ça c'est une autre façonde faire avec une fonction, alors moi je préfère souvent passer par des fonctions, ce que j'aimemoins justement avec les CBV c'est que si on les utilise tout le temps c'est superpratique en deux lignes de code vous pouvez faire la même chose que ce qui vous prendrait
00:56:17 :dix lignes à faire ici, parce que là vous voyez moi je suis obligé dans ce cas-cid'aller utiliser ma classe pour récupérer tous les blogposts qui sont dans ma base dedonnées et ensuite je dois moi-même construire mon contexte en lui passant des choses etcetc. Alors que là en fait je peux enlever tout ça ici et là ça va marcher. Juste
00:56:36 :avec ces deux lignes en fait il sait que comme j'ai un listview il faut qu'il a récupérétous les blogposts, donc tout ce que j'ai spécifié ici par rapport à mon modèleet qu'il faut qu'il retourne un template qui s'appelle explicitement le nom de monmodèle en minuscules tiré du bas list. Donc tout ça c'est fait pour vous. Ce que
00:56:53 :je trouve un peu compliqué c'est que quelqu'un qui arrive dans votre code qui sait pas ça,qui voit ces deux lignes de code, bah il se dit mais attends comment c'est possible,il se dit attends avec deux lignes de code là je vais dans mon, je vais là et tu vois
00:57:07 :j'ai un super article. J'ai mon article et si j'avais plusieurs articles avec deuxlignes de code je peux afficher tous les articles de ma base de données. Alors que
00:57:15 :quand on le fait en fbv bah y'a pas mal de trucs à faire. Mais voilà c'est vraimentdeux écoles de pensée, si vraiment on fait du class-based use tout le temps c'est superpratique, c'est super puissant mais c'est pas forcément toujours facile à lire etquand vous retournez même vous même dans votre code plusieurs mois après, des fois
00:57:34 :vous êtes là en mode waouh je me rappelle plus le get context data qu'est ce que c'estque ce truc là et tout. Et en fait on se retrouve souvent à retourner dans la documentation
00:57:41 :à devoir fouiller parce qu'on se souvient plus en fait de ce que ça fait. Moi j'aipris les vues fondées sur les classes mais peut-être que ce sera pas simple mais jesuis curieux de savoir parce que en faisant les formations, la formation complète Djangoversus le site e-commerce j'ai préféré quand même les vues fondées sur les classes.
00:58:00 :Ouais bah c'est vraiment, tu vois je te dirais y'a pas de bonne ou de mauvaise façon defaire, c'est vraiment un peu comme Linux et Windows quoi. T'as des bons arguments des
00:58:12 :deux côtés, ça dépend du projet, ça dépend des gens, ça dépend des équipes. Moi jesais que je suis déjà tombé sur des articles de développeurs super senior etc qui démontaientjustement les classes base views parce qu'ils disaient que justement à chaque fois qu'ilsarrivaient dans des boîtes et que c'était ça qui était utilisé c'était un bordel
00:58:32 :à comprendre parce qu'en fait ils avaient tous des petits trucs après qu'ils faisaientun petit peu différemment et il fallait à chaque fois se replonger là dedans alorsque quand ils avaient des vues basées sur les fonctions, avec une approche fonction,c'était un peu plus verbeux mais voilà ils comprenaient plus. Donc c'est vraiment
00:58:48 :différentes à prendre. Je sais que par exemple Thierry il aime beaucoup les vues fondéessur les classes. Tu peux faire un peu des deux aussi, ça dépend. Moi je pense qu'il
00:58:56 :y a des projets où pour un truc très précis t'as pas besoin de t'embêter, c'est unpeu pour ça aussi qu'elles ont été créées au départ. Ouais? T'as une question? Non
00:59:07 :non je suis d'accord. Après il m'a fait le début du projet mais moi je voyais pastout ça comme ça. J'ai regardé en fait des projets sur Github de Thierry Angelo,
00:59:20 :lui il dit qu'il faut en faire le moins possible dans les vues, dans le vue.py alors que moij'ai vu des trucs qui faisaient des milliers de lignes dans les vues. Oui alors ça c'était
00:59:29 :en fait, là c'était même encore un autre truc dans le sens où tu peux quand mêmefaire des vues basées sur les fonctions et avoir des vues très petites en fait. Ça
00:59:41 :c'est pas, et à l'inverse tu peux faire des classes based views et mettre plein pleinde trucs que tu pourrais mettre dans les modèles par exemple et finalement faire la logiquedans la classe. Donc ça c'est encore un autre tu vois, un autre écueil je dirais.
00:59:55 :Après en fait aussi ce qu'il faut comprendre c'est que les classes based views ça a vraimentété créé, et tu le vois d'ailleurs quand tu vas voir la documentation, t'as la vuecreate, list, update, delete, donc on est un peu dans ces options crudes qui sont destrucs que effectivement si t'as un projet où tu veux afficher une liste d'éléments,
01:00:17 :permettre d'en créer un nouveau, d'en supprimer un, donc ce qui est quand même la plupartdes projets qu'on fait, bah là effectivement c'est Django super puissant, c'est que commeje te dis avec peut-être une centaine de lignes de code tu peux avoir un projet completqui fonctionne, ce qui est assez incroyable. Après par contre quand tu vas faire un truc
01:00:34 :pas mal plus complexe des fois c'est, ouais, on va mieux repasser sur les fonctions. Maisbon. Juste pour terminer là-dessus, je voulais juste vous montrer ce petit exemple pour vous
01:00:46 :montrer le get ici, directement ce que je fais, donc le get c'est une méthode qui estappelée en fait quand, directement quand je fais une actualisation de la page, doncquand je me rends à cette adresse ici, en fait on va passer dans le get. Donc là par
01:01:00 :exemple ce qu'on pourrait faire c'est juste mettre un print, et vous allez voir que sije fais un print hello, si je vais voir dans mon terminal, tout s'est rechargé, je reviensici, j'actualise, et là vous voyez on a le hello qui est affiché. Et si je fais pas
01:01:17 :le return de tout ça, donc si je fais pas return super, je reviens là, j'actualise,et là qu'est-ce que j'ai? J'ai une value error parce qu'il me dit ça a pas retourné
01:01:25 :un HTTP response object. Donc là ce que je pourrais faire c'est dire ah oui merde okil faut que je retourne un HTTP response, donc ça c'est une réponse HTTP, et je luidis le blog. Là en fait j'ai complètement écrasé du coup tout ce qui est fait là
01:01:41 :encore dans cette méthode get. Donc si je vais voir dans la méthode get de ma liste,elle doit être quelque part ici, là je pense que comme, the base method, oui, alors attendez,je vais aller là, list view, base list view, voilà get. Vous voyez tous ces trucs là,
01:02:04 :là encore je le fais pas. Donc je récupère pas mon object list, je récupère pas lecontexte, je passe pas le contexte etc. Donc là si je reviens là ça va marcher, cette
01:02:12 :fois-ci j'aurai plus d'erreur mais j'aurai juste le blog, donc juste la chaîne de caractèreque j'ai retourné. Donc là c'est pour ça que, encore une fois, on fait le super, et
01:02:21 :on fait un, on retourne en fait cette même fonction, donc pour ça c'est un peu bizarre,on se dit bah attend, super get pourquoi alors qu'elle est déjà là, pourquoi j'ai besoinde faire super get? Et ben c'est tout simplement pour faire tout ce qui est fait en amont.
01:02:33 :Et entre les deux on pourrait se dire bah avant d'afficher la page, avant de retournerla réponse avec tout ce qui est, avec le fichier HTML, avec toutes les données demon fichier etc, bah avant ça je veux là encore je sais pas, envoyer un mail quoi.
01:02:46 :Envoie un mail ou je sais pas dire, on pourrait avoir un genre de Google Analytics, dire rajouterfaire utilisateur plus égal 1 quoi, ou visite plutôt visite plus égal 1 et sauvegarderça dans une base de données par exemple. Et comme ça à chaque fois qu'il y a quelqu'un
01:03:01 :qui viendrait faire une requête sur votre site, sur cette page, bah vous auriez un compteurqui s'incrémente de 1. Voilà, un truc tout con. Et c'est bien important aussi à chaque
01:03:13 :fois, ça c'est le truc, bon je vais pas trop là dessus, mais parce que bon là aprèsil y a les ARC, les QUARZ, donc déjà si vous savez pas ce que c'est, ça fait peuret tout, et à chaque fois en fait on les repasse, et des fois on se dit est-ce qu'on
01:03:21 :a besoin de les repasser, parce que des fois en fait on les donne pas et ça marche quandmême, mais prenez l'habitude quand même de repasser ces informations, parce que sijamais en fait vous appelez ces méthodes et vous passez quelque chose, si jamais àun moment on avait ça et on passait data égale, je sais pas, bonjour, bah là vous
01:03:39 :voyez qu'on passe des informations à la méthode get, et si on a passé ARC, DC, QUARZet qu'on les renvoie pas ici, bah les informations seront pas transmises en fait d'un bout àl'autre. Je rentre pas trop là dedans, là on rentre vraiment dans des trucs plus complexes
01:03:54 :et faudrait que je fasse des exemples plus précis pour vraiment vous montrer la différenceentre les deux, mais après c'est des trucs que je montre dans la formation e-commercejustement, je me rappelle, c'est pour ça que je suis quand même assez content de toutle contenu que je rajoute, parce que ça répond à pas mal de questions, donc ce truc là
01:04:13 :si vous allez voir, je me rappelle même où c'est, c'est dans…Moi je viens de vous abandonner, je suis désolé.Ouais pas de soucis, on est à une heure là donc…Merci beaucoup Thibaut. Pas de soucis, et bon week-end du coup.
01:04:25 :Ouais merci Thibaut. Donc ouais, juste, et puis je vais finir làdessus du coup, puisque ça faisait le tour de ce qu'on avait vu, c'était dans le modèleutilisateur, ajouter la gestion des utilisateurs, créer le modèle, alors dans cette tête,oui, personnaliser notre modèle, voilà, créer un jeu utilisateur, voilà c'est celui-là.
01:04:48 :Et là dedans j'explique, puisqu'on retrouve en fait ces notions, là encore vous voyezen fait on va modifier le create user, et on a les quarks ici, et quand j'utilise leself.model je repasse les quarks, parce que si jamais on passe d'autres informations ici,
01:05:04 :en plus de l'email et du mot de passe, et ben quand on crée notre modèle il faut qu'onpuisse passer ces informations. Donc si par exemple vous passez la date de naissance ou
01:05:12 :je sais pas, d'autres informations sur votre utilisateur, si vous passez pas ces informationsen plus qui sont données au moment où on utilise cette méthode à la création dumodèle, bah ça sera tout simplement pas pris en compte dans la création du modèle.
01:05:26 :Donc faut pas oublier comme ça que des fois on peut avoir des éléments qui sont passésen plus, et on sait pas lesquels c'est forcément, c'est tout l'intérêt des quarks, c'est queça va récupérer tout ce qui n'est pas défini avant, donc tout ce qui n'est pas email et
01:05:38 :password ça va être récupéré dans ce dictionnaire quarks, et donc vous allez pouvoir le passer,et passer l'information d'un modèle à un autre. Donc voilà, on est rentré pas mal
01:05:50 :dans le concret là, avec des trucs un peu plus avancés, je sais pas si ça parle unpeu à tout le monde, mais je pense que ça permet aussi de voir des exemples, et de voirdes trucs, faut pas avoir trop peur, c'est des trucs qui se font petit à petit, et qui
01:06:06 :bien souvent, comme je vous dis, vous allez voir la documentation, ce coup là, au débutvous savez pas trop, vous essayez, ça marche, et puis bon, et puis petit à petit vous allezavoir justement des sessions comme ça où vous allez pouvoir avoir des explicationsun peu plus complètes de ces éléments complexes. Donc voilà. Donc voilà, je sais pas s'il
Aucune occurrence trouvée pour « ».
Bravo, tu es prêt à passer à la suite