Session du 31 mai 2024 à 21h00
Pratique & Live Coding
TOSA & Certifications
Programmation Orientée Objet (POO)
Deviens membre Premium magic_button
Cette session de mentorat est réservée aux membres Premium. Rejoignez-nous pour accéder à toutes les rediffusions des sessions de mentorat !
Premium
- check +100h de formations
- check +180 exercices de code
- check +100h de mentorats en rediffusion
- check 20 projets
- check Mentorats groupés hebdomadaires
- check Support individuel avec nos mentors
Session de mentorat TOSA + Premium
Session de révision sur des notions d'orienté objet.
00:00:00 :C'est bon, salut Claude !Thibault, avant que ça ne commence, est-ce que tu peux partager mon écran ?Ouais, ouais, bien sûr, vas-y !Tu vois, on parlait des classes méthodes perso, moi j'ai dit comme ça, ça me permet de créer des instances, mais de manière un peu fabriquée.
00:00:37 :Tu fais comme ça aussi en général toi ou pas ?Ok, là tu fais carrément un create directement sur ton object, ouais.J'avoue que j'ai jamais eu besoin de le faire, je réfléchis, souvent je le fais plutôt avec des fonctions séparées.
00:00:59 :Après c'est vrai que c'est l'exemple que j'ai donné d'ailleurs aussi la semaine dernière quand j'en parlais.Donc moi je réfléchis, ça ne me choque pas comme ça.
00:01:10 :Je réfléchis si il n'y avait pas un mécanisme similaire dans Django, parce que dans Django tu peux créer tes propres managers,mais c'est plus pour modifier, pour accéder plus facilement à certains éléments de ta base de données sans avoir besoin de refaire des filtres et tout.
00:01:29 :Là je fasse des paramètres directement dedans.Ouais, ouais, ouais, alors après je vois que...Je vois que... Ouais, character, user, ok, puis après t'as tout ça, ouais.
00:01:41 :J'avoue que... Ouais, faudrait voir après où est-ce que t'appelles ça et tout.J'aurais peut-être tendance plutôt à faire des fonctions qui...Parce que là du coup il y a juste une ligne de code et finalement tu passes directement un character, un user, avec beaucoup de choses après qui sont définies.
00:01:59 :Donc tu vois finalement on ne voit pas trop... Enfin c'est ça, il faut voir après où est-ce que c'est utilisé.Comme je te dis ça ne me choque pas, je pense que c'est vraiment après plus une question de comment tu l'utilises dans la globalité de ton application.
00:02:13 :Moi je n'ai jamais eu à le faire, mais en même temps c'est ça, je n'ai pas...Enfin souvent après je réfléchis aussi dans Django, quand tu crées des objets,souvent personnellement c'est des choses qui sont créées à partir d'une interface, avec des choses qui vont changer à chaque fois,
00:02:30 :qui vont être définies par un formulaire ou des choses comme ça.J'ai rarement besoin de créer des choses un peu toutes faites comme ça,donc c'est pour ça que je pense que je n'utilise pas souvent ça directement.
00:02:41 :D'accord, d'accord, d'accord.C'est ça, je réfléchis à chaque fois qu'il y a des choses qui sont créées,c'est ça, c'est souvent des choses dynamiques avec des formulaires,ou alors sinon c'est ça, comme je te dis, je vais plutôt avoir tendance à faire un petit script utilitaire,si c'est vraiment des choses, ça va être des cronjobs ou des choses comme ça,
00:03:01 :et puis ça sera un script avec des choses un peu baked, avec des valeurs prédéfinies,et du coup ce sera juste un script qui va faire à peu près la même chose que ta méthode de classe.
00:03:14 :Ok, merci, pas de soucis.Ok, donc, on a pas mal de monde, je vais faire un petit message sur le Discord.Alors, ce soir, je vous ai prévu...
00:03:30 :On va faire...Ad Premium à Toza.Le mentorat commence.Alors avant que j'oublie, pour ceux qui sont dans le programme Toza,je vais vous faire signer la petite feuille de présence.
00:03:44 :Donc ça c'est juste si vous suivez le programme de la certification Toza,les autres, pas besoin de signer ça.Donc ce soir, j'ai prévu de vous refaire travailler un petit peu comme la semaine dernière,apparemment ça a pas mal plu, et c'est des choses qu'on vous avait pas mal suggérées aussi,
00:03:59 :d'avoir des sessions un peu plus interactives,parce que c'est aussi quelque chose que je trouve assez cool,finalement toute la théorie est sur le site ou ailleurs,et donc c'est souvent mieux de pouvoir faire des choses où vous êtes plus actifs.
00:04:14 :Donc la semaine dernière, on a testé pour la première fois Wooclap,dont j'entends parler depuis pas mal de temps,qui permet de faire ces choses-là justement de façon un peu plus interactive avec tout le monde,sans que vous ayez besoin de taper dans le chat de façon un peu aléatoire.
00:04:29 :Et on va aussi voir un petit peu des exercices,donc ça va être un peu orienté quand même sur l'orienté objet,justement si c'est le cas de le dire,sans forcément aller vraiment plus loin que ce qu'on a vu la semaine dernière.
00:04:46 :Pour ceux qui étaient là, on avait parlé pas mal d'orienté objet,la semaine dernière il y avait pas mal de gens qui n'étaient pas super à l'aise avec l'orienté objet,et j'avais prévu des choses qui étaient déjà quand même bien, enfin pas avancées,mais qui nécessitaient de bien avoir vu l'orienté objet.
00:05:01 :On va refaire des choses un petit peu dans ce sens-là,ça va permettre de faire des révisions pour ceux qui connaissent un petit peu,et de découvrir l'orienté objet pour ceux qui ne connaissent pas du tout,de voir à quoi ça ressemble, à quoi ça peut servir.
00:05:11 :Et on va faire ça aussi avec des petits exercices que je vous ai prévus,que ce soit des exercices de code sur docstring, qu'on va faire un petit peu ensemble,qu'on va décomposer, et des exercices plus interactifs qu'on va faire avec Wooclap.
00:05:25 :Donc je vais vous partager tout ça, je vais vous mettre de l'autre côté.La semaine dernière ça arrêtait le Wooclap quand je le changeais d'écran,je vais essayer de ne pas le faire planter cette fois.
00:05:43 :Je vous ai prévu des petites révisions, je vous mets le lien dans le chat.Tac, il y a encore des gens qui arrivent.Donc je vous mets le lien, normalement si vous accédez à cette URL dans votre navigateur,vous allez être redirigé vers l'interface qui va vous permettre de répondre aux questions.
00:06:11 :Donc confirmez-moi si c'est bon de votre côté.Réponse, statistique, résultat, je veux voir la question, voilà c'est ça.Bonsoir, bonsoir Théo.Salut Ursula, ça va ?
00:06:25 :Ouais ça va.Ok alors je vois des pouces, ça a l'air de marcher, vous avez bien accès.On commence avec des petites révisions, pour ceux qui étaient là la semaine dernière,ça va peut-être être assez simple, mais justement c'est pour voir si vous avez retenu.
00:06:39 :Il y avait eu pas mal de mauvaises réponses sur celle-là, je l'ai remise parce qu'elle est assez rapide.Donc t'inquiète Gab, c'est bien aussi comme ça qu'il y ait des gens qui n'étaient pas là, ça va faire des...
00:06:52 :Je sais, qui était là la semaine dernière ? Je vais voir dans les participants.Il me semble qu'il n'y a pas énormément, il y a Arnaud peut-être qui était là, Jacqueline aussi, ouais.
00:07:02 :Il y avait 2-3 personnes qui étaient là je pense.Ouais, Sylla aussi, ouais.Sylla, Arnaud, Jacqueline, ouais.Bon bah ça va vous faire des révisions.
00:07:15 :Alors, combien y a-t-il...Ah oui, je ne vous ai pas partagé mon écran, je vais le partager pour ceux qui...Voilà, normalement vous devez voir mon écran.
00:07:30 :Donc, combien y a-t-il d'instances de voitures dans ce code ?Donc, on a déjà des petites réponses qui arrivent.Ah oui, j'ai mis des timers sur d'autres questions aussi.
00:07:41 :Alors, 6 réponses et il y a 9 personnes.Ok, j'attends encore quelques secondes.Ok.Sylla, il est juste en haut, je sais pas...Attends, je vais te le remettre.
00:07:57 :Tac.Ouais, au clap.Tac.Je te le remets ici.Voilà, normalement si tu accèdes à ce lien sur ton navigateur,tu devrais arriver sur la page qui te permet d'y répondre.
00:08:12 :Donc, combien y a-t-il d'instances de voitures dans ce code ?Alors, qu'est-ce que vous avez mis de 1.5 ?Ça va être difficile, ça.Alors, on a majoritairement 1 et quelques 2.
00:08:28 :Ok, d'accord.Alors, je sais plus si je peux, comment je peux...Réponse les plus fréquentes.Je suis encore un petit peu perdu.Je trouve pas leur interface super bien faite.
00:08:36 :Ouais, c'est ça, je sais même pas si je peux afficher.Je peux fermer.Ouais, les votes.Ok, vous ne pouvez plus voter.Non, c'est ça, je sais même plus si j'avais une réponse statistique.
00:08:50 :Ok.Donc là, dans ce cas-ci, combien y a-t-il d'instances de voitures dans ce code ?Donc, la bonne réponse, effectivement, vous êtes majoritairementAh oui, ok, que l'autre avait pas vu la question.
00:09:02 :Effectivement.Donc, il y en a une, parce qu'ici, en fait, c'est la même chose quequand on fait une assignation comme ça,où on a deux variables qui sont donc voiture1, égale voiture2, égale voiture.
00:09:13 :On ne crée qu'une seule instance.Donc ça, je l'avais expliqué la semaine dernière.Il faut toujours se rappeler que quand on a les parenthèses,je vais reprendre mon petit stylo, ici, encre éphémère.
00:09:22 :Quand on a nos parenthèses ici, c'est vraiment les parenthèsesqui vont appeler quelque chose,que ce soit une fonction ou là, dans ce cas-ci,qu'ils vont appeler la classe pour créer une instance.
00:09:33 :Et donc là, même si on a deux instances qui sont,deux variables, en fait, deux noms de variables qui sont créés,on n'a qu'un seul objet qui est créé.
00:09:42 :Et donc, ces deux éléments-là,ils vont pointer vers la seule instance qui a été créée iciavec l'appel des parenthèses.Donc, c'est une façon vraiment de visualiser ça, de se dire,ok, on n'a pas deux choses qui sont créées ici.
00:09:55 :Si on avait une assignation qui était faite de façon parallèle,donc voiture01.voiture02 égale voiture, voiture,là, on aurait deux fois voiture.Donc, je vais entrer dans un terminal, ce sera plus clair.
00:10:13 :Si on avait voiture, je vais grossir un petit peu ici,voiture01.voiture02 égale voiture, voiture, comme ça,là, on aurait bien deux instances de créé,puisqu'on aurait deux fois les parenthèses ici,donc deux fois l'appel, on crée deux objetset on les assigne respectivement dans voiture01 et voiture02.
00:10:31 :Là, on a deux objets, deux noms, en fait,deux variables, deux noms de variables qui pointent vers le même objet.Je ne m'attarde pas trop là-dessus parce que vous avez majoritairement bien répondu,mais voilà, petite question un petit peu piège ici.
00:10:45 :Ça va pour ça ?Ok, super.Oui, autre petite question qui vous avait posé un peu de problème.Donc, dans quel ordre pile-t-on, cherche-t-il les attributs en partant de la classejusqu'à l'instance ou la verse ?
00:11:03 :Dans quel ordre le code suivant va-t-il afficher les marques ?Donc, on a ce code ici avec une classe voiture, avec une marque,et ensuite, on crée une instance, on affiche la marque,on change la marque sur l'instance, on affiche de nouveau la marque,on change la marque sur la classe,
00:11:24 :et ensuite, on réaffiche de nouveau la marque de l'instance et de la classe.Donc là, il faut remettre les choses en ordre pour remettre en ordre les prints.
00:11:33 :Donc, est-ce que ça va afficher Renault-Renault-Ferrari-Porscheou Ferrari-Renault-Porsche-Renault, etc.Donc, il faut remettre les choses dans l'ordrepour que ça produise le résultat que va faire ce code.
00:11:45 :Et donc, la question derrière ça, c'est comment Python va chercherquand il a des attributs qui sont de classe ou d'instance,qu'est-ce qui va être prioritaire,qu'est-ce qui va se passer si on change un endroit et pas un autre,donc sur l'instance ou sur la classe, etc.
00:12:03 :Qu'est-ce que ça va changer quand on va afficher sur l'instance ou sur la classedans un sens comme dans l'autre.Donc celle-là aussi, il faut prendre le temps de regarder.
00:12:14 :Ok, je vois qu'il y a quatre réponses déjà.Et pour ça, il faut vraiment savoir quel est l'ordre.Une fois que vous le savez, après, il faut se mettre dans la tête de l'interprèteur Pythonet aller lire ligne par ligne et se poser la questionsur quel élément je suis, quel objet je suis, qu'est-ce qui prime.
00:12:36 :Si vous avez la réponse à qu'est-ce qui prime, vous allez savoir qu'est-ce qu'il faut mettre.On a une majorité de personnes pour cette organisation-là.Donc Ferrari, Renault, Renault, Porsche.
00:13:01 :On revient ici.Là, on crée une instance à partir de la classe.À ce moment-là, on n'a pas d'attribut d'instance, on a juste l'attribut sur la voiture.
00:13:16 :Donc là, Python va faire le chemin de regarder déjà ce qu'il a au niveau de l'instance.Donc là, dans le unit, ici dans le self, on n'a rien défini sur notre instance voiture 1.
00:13:28 :Donc quand on affiche la marque, Python va déjà regarder sur l'instancesi on a un attribut d'instance, c'est ça.Si on n'en a pas, il va regarder est-ce qu'on en a un au niveau de la classe ici.
00:13:39 :Donc là, c'est le cas.Si ce n'était pas le cas, on aurait une erreur parce qu'il ne peut pas l'inventeret il va y aller dans l'ordre instance, classe et après, il n'y a plus rien.
00:13:48 :Une fois qu'on change ensuite, donc là, le premier qu'on fait,voiture01.marque, on va afficher Ferrari.Ensuite, on assigne Renault cette fois-ci sur l'instance.Donc là, et c'est là que ça mélange souvent les gens,même si on n'a pas d'attribut qui est défini ici, on va en créer un.
00:14:07 :Et ça, on peut le créer même s'il n'est pas défini par défaut dans le unit,ça ne vous empêche pas par la suite d'en rajouter.
00:14:15 :Souvent, vous allez avoir par contre, si je me souviens bien dans votre IDE,ça fait un moment que je ne l'ai pas vu,je sais que je le voyais beaucoup quand je faisais du PySide,des interfaces graphiques, parce que j'avais un avertissement qui me disaitque souvent, quand on crée des attributs qui ne sont pas dans le unit,
00:14:38 :il vous l'indique.Il vous dit attention, vous êtes en train de créer un attributque vous n'avez pas créé dans le unit et donc il se dit que potentiellement,il peut y avoir d'autres endroits si vous le créez dans une autre méthodeou si vous le créez en dehors dans votre espace global.
00:14:51 :Ça peut être potentiellement dangereux parce que vous allez avoir un attributqui ne va pas être sur toutes les instances dès qu'elles sont créées.Il va être créé peut-être à un moment dans une méthode et s'il y a une autre méthodequi est appelée avant que la méthode qui crée l'attribut ait été appelée,
00:15:06 :ça peut poser des problèmes.Alors que si vous le mettez dans le unit, au moins vous avez une valeur par défaut.Là, imaginons que je n'ai pas défini le marque Ferrari sur la voitureet que j'essaie d'afficher voiture01.marque, là forcément je vais avoir une erreur
00:15:22 :parce que je ne l'aurai pas défini dans le unit, je ne l'aurai pas défini sur la voitureet c'est ce que je vous disais, à un moment il n'y a plus d'autre endroit où chercher.
00:15:28 :Par contre, si je le définis après ici, là j'aurai bien, quand je vais l'afficher,Renault qui va être affiché.Sylla, tu as une question ?
00:15:37 :Oui, au fait, là on a dit, on a signé marque à voiture01, Renault,mais dans l'autre instance, dans le self, il n'y a pas l'attribut marque.
00:15:53 :Oui.J'aimerais savoir, au fait, à chaque fois il y aura l'attribut marqueou bien c'est juste à l'instant T là qu'il y aura marque ?
00:16:01 :Genre dans le code devant, je pourrais utiliser le marqueou bien c'est juste là où je l'ai défini parce que le self n'a pas l'attribut marque.
00:16:10 :Ben c'est justement, c'est ça le point délicat à comprendre,c'est que tu peux créer, c'est comme si tu créais une variable ici,quand on fait voiture01.marque, c'est comme si tu créais une variable marque
00:16:24 :sauf que là elle est associée à ton instance.Donc après si tu essaies de faire un print marque sans faire voiture01.marque,il va te dire marque ça n'existe pas.
00:16:33 :Mais tant que là tu as créé du coup un attribut qui est associé à cette instanceet ça tu peux en faire autant que tu veux.
00:16:40 :Je vais ouvrir un PyCharm pour vous montrer ça.Ce sera plus simple.Prog orienté objet.Ok.Donc est-ce que vous voyez le code ?Ouais normalement c'est bon.
00:16:54 :Je vais zoomer un petit peu.Zoom, zoom c'est lui.Ok.Donc on va reprendre juste voiture.Là on va mettre un pass et on va juste mettre le init.
00:17:10 :Je vais enlever mon copilote.Donc on va mettre juste le init et rien dedans.Donc là je vais faire une Porsche voiture et là si je fais Porsche.marque,
00:17:25 :là je vais avoir une erreur.Il me l'indique parce que là il n'y a rien qui est défini.Donc si je lance le script, on a un attribut erreur.
00:17:32 :C'est ça d'ailleurs qui est à noter si je fais un print de marque ici,que je commande ça.Là vous voyez d'ailleurs dans le nom de l'erreur,ici on a un nameerror parce qu'on a un nom qui n'est pas défini.
00:17:47 :Ici quand on fait un print de marque.porsche, c'est un attributeerror.Parce que effectivement, même si au final tout ça,comme je vous dis, vous pouvez voir ça comme des variables,là c'est un attribut parce qu'il appartient à une instance.
00:18:04 :Donc on appelle ça un attribut dans le vocabulaire.Mais finalement, si vous voulez, c'est comme si on faisait,justement si on faisait, ça reste des objets tout ça.
00:18:13 :C'est pour ça qu'on dit souvent que tout est objet.Aussi si je fais une marque égale voiture, c'est une chaîne de caractère.Si je fais Porsche.marque égale Porsche comme ça,
00:18:23 :pareil, c'est une chaîne de caractère.Donc ce qu'il faut juste comprendre ici, c'est vraiment que ça,c'est pas juste une variable toute seule,c'est pas juste un nom qui est tout seul,c'est un nom qui est associé à cette instance ici.
00:18:35 :Ça va être à peu près la même chose quand vous faites,si je fais import random, je vais voir random.rendint par exemple.Là c'est pareil, vous avez quelque chose qui est relié par le point,donc le point c'est vraiment l'appartenance.
00:18:46 :Dans ce cas-ci c'est une fonction,enfin dans ce cas-ci c'est pas une fonction,c'est un constructeur si je ne me trompe pas,qui va permettre de créer un...
00:18:55 :Oui, ça va être...Faudrait voir, je suis même pas sûr si c'est une fonction...Non c'est probablement peut-être plus une fonction qui retourne juste un nombre aléatoire,parce qu'au final ça retourne un nombre.
00:19:06 :Donc voilà, en tout cas c'est un objet qui appartient au module random ici.Donc là c'est pareil, on accroche quelque chose à quelque chose d'autre.
00:19:17 :Et après du coup, une fois que tu l'as défini,tu peux l'afficher, tu peux le changer,exactement comme tu ferais avec, si on met Renault ici,exactement comme tu le ferais avec une variable.
00:19:31 :Donc là je le relance et on a bien la première fois Porsche et la deuxième fois Renault.D'accord, je vois, je vois.Donc il est toujours lié à l'instance en fait.
00:19:40 :Ouais, il est vraiment lié à l'instance.Et tant que ton instance elle est là, tant que tu la supprimes pas,c'est sûr que là si je fais Dell de Porsche,c'est un truc qu'on fait assez rarement, de supprimer des choses comme ça,parce que souvent le garbage collector s'en charge et on a pas besoin de jouer avec ça,
00:19:57 :mais ça peut être le cas,bah là forcément j'ai plus ma marque, tu vois, parce que Porsche il n'existe plus,et le marque il est associé à ça, donc ça a supprimé tout ce qui était avec.
00:20:06 :Il va pas se séparer de l'instance effectivement.Ok, là je suis ok, c'est bon.Ok, donc si je reviens sur le Wooclap,donc voilà, donc là effectivement, donc la première fois ici on va afficher Ferrari,la deuxième fois, donc là on a changé, enfin on a créé du coup,
00:20:26 :et c'est là où justement ça devient aussi un truc qui confie des fois chez les étudiants,c'est que là du coup on a deux noms qui sont les mêmes, marques,mais il y en a un qui est associé à l'instance et un qui est associé à la classe.
00:20:41 :Donc on a un attribut d'instance et un attribut de classe.Donc là on l'a créé ici sur l'instance,donc quand on l'affiche, on affiche exactement celui qu'on vient de créer,donc on affiche Renault.
00:20:52 :Et ensuite on change la marque sur cette fois-ci la classe,et c'est là qu'on se retrouve dans la mémoire avec deux attributs,un attribut d'instance et un attribut de classe qui sont distincts, qui ne sont pas les mêmes.
00:21:07 :Et du coup, c'est ça aussi l'intérêt du coup de ce mécanisme,c'est qu'on peut avoir un cas général, je reviens sur mon exemple des roues,on peut se dire en général toutes les voitures ont quatre roues,et des fois sur une instance spécifique dire,ah bah sur cette instance là on va avoir besoin de modifier les choses pour rajouter des roues,
00:21:27 :donc cette instance on va lui dire que les roues, il va y en avoir six,donc on va faire mon instance.roues égale six,et ça ne va pas changer le nombre de roues en général pour toutes les voitures qu'on va créer par la suite.
00:21:37 :Donc on aura toujours quatre roues dans l'attribut de classe de la voiture,je vais revenir sur mon guide charm pour que ce soit clair,donc on aura roues égale à quatre ici,et si on se dit que là on fait un camion,je peux dire pour mon camion, mon camion va dire que les roues sont égales à six,
00:21:53 :mais si par la suite je fais une Porsche justement,elle si je fais print de Porsche.roues,et que là je fais un print de camion.roues,
00:22:04 :je lance, là on a bien six et quatre.Donc vous voyez qu'on a changé cet attribut juste pour mon instance,et après quand je refais une voiture ça ne va pas changer pour les autres que je vais créer.
00:22:16 :Si par contre ici je change et je me dis maintenant,à partir d'aujourd'hui, à partir de ce point là dans mon script,on ne va plus créer que des voitures qui ont six roues,bah là du coup toutes les voitures que je vais créer après,là je relance le script, auront six roues de base.
00:22:31 :Et de la même façon après je peux rechanger en disant que finalement,ma Porsche est incroyable, elle n'a que deux roues,et je peux faire ça, et là si je recrée ensuite une voiture,ici et que j'affiche roues, bah là on sera encore à six,parce que c'est la valeur qu'on a définie ici.
00:22:46 :Donc voilà, c'est vraiment, il faut voir qu'on a deux attributs,si par défaut il n'y en a qu'un,s'il n'y en a qu'un, il va aller chercher,enfin s'il n'y a que celui de la classe, il va aller chercher de la classe,s'il y a l'instance et la classe, il va déjà afficher l'instance,
00:23:02 :s'il n'existe pas il va aller chercher la classe,et donc là la dernière fois on change voiture.marque pour Porsche,la marque de la voiture 1 n'a pas changé,donc on va afficher une deuxième fois Renault,et pour finir on va afficher la valeur qu'on a changée qui est Porsche.
00:23:16 :Donc là effectivement, la bonne réponse c'était celle-là,donc Ferrari une première fois, Renault deux fois,et Porsche une dernière fois.C'est bon, super.Et effectivement comme l'a dit Gab, sauf en cas de slots,slots c'est un attribut qui permet d'indiquer,d'empêcher en fait la création de n'importe quel attribut,
00:23:45 :en fait on va dire ok tu peux créer ces attributs, mais pas d'autres.L'intérêt de ça c'est d'économiser sur de la mémoire,donc c'est un cas assez spécifique,c'est vraiment si vous savez que vous allez avoir une classequi n'a besoin que d'avoir deux éléments,ça va permettre à Python d'être plus optimal sur la mémoire,
00:24:04 :pour ne pas permettre à votre instance d'avoir tous les attributs possibles.Ok, alors on revient, là on sort un tout petit peu de l'orienté objet,celle-là je la trouvais intéressante, je vais vous mettre,là c'est un petit peu aussi pour les gens qui font le Toza,parce que voilà ça fait un mois et demi qu'on est dedans,
00:24:25 :et je pense que c'est bon d'avoir des petites piqûres de rappel comme ça.Alors là il y a un petit compte à rebours, vous avez une minute quarante,donc regardez, je vous laisse regarder,donc si on a une variable myvar qui contient une liste avec 1, 2, 3, 4, 5,
00:24:40 :laquelle de ces lignes donne la valeur 1, 2 ?Il y a plusieurs réponses possibles,donc là il faut choisir.Donc là, j'avais donné des petits,je ne veux pas afficher les résultats, je ne veux pas vous influencer,j'avais donné des petits moyens mnémotechniques pour ça.
00:25:15 :Après tu l'as de ton côté non Cécile ?Je peux essayer, ça ne grossit pas énormément, je peux essayer un peu.Ah si c'est quand même mieux.
00:25:36 :Ok.Ah oui, j'ai un zoom là.Ok, je vais rester sur la même ligne.Ok, 10 secondes restantes,il reste deux retardataires.Ok, alors.Résultat.
00:26:20 :Vous êtes bon, si je ne me trompe pas, dans mes souvenirs c'était ça,je ne sais pas si c'est ça, réponse correcte, bravo,il n'y a personne qui a donné une mauvaise réponse.
00:26:30 :Ce qui pose souvent des problèmes ici, c'est qu'on ne sait pas,le 1, 2 ici par exemple, où est-ce qu'on commence,donc là 1, 2, est-ce qu'on va commencer au premier,justement à ce premier élément,ou est-ce qu'on va commencer ici seulement et ensuite récupérer le 2,et donc ce que je disais comme moyen mnémotechnique,
00:26:48 :c'est de se dire que c'est pareil aussi quand on ne met rien ici,c'est que par défaut justement, vous pouvez mettre 0,et donc 0 logiquement c'est le tout début ici,donc par exemple dans le cas ici du 0,on va commencer dès le début, quand on ne met rien,
00:27:05 :c'est comme si on mettait 0, donc ça veut dire qu'on va commencer ici,donc si on a 1, ça veut dire qu'on ne va pas commencer au début,mais qu'on va bien commencer après celui-là.
00:27:14 :Donc si on a 1, 2, et comme après le 1 il y a le 2,ça veut dire qu'on va s'arrêter à celui-là,on ne peut pas avoir 1,5 ou des choses du genre,donc on commence à 1, on finit à 2, donc dans ce cas-là,1 n'est pas bon, ça n'est pas valide,
00:27:29 :parce qu'ici on récupérerait juste l'élément 2 ici.On a celui-là qui est bon parce qu'on part du début,donc c'est ça, et on s'arrête à 2,donc comme on part du début là aussi, de la même façon,on n'est jamais trop sûr parce qu'on se dit mince,le 2 ici, est-ce qu'on s'arrête à 0, 1, 2,
00:27:47 :et du coup je prends le 3,ou est-ce que c'est 0, 1, 2 et je prends le 2,donc là c'est pareil, il faut se dire que si on n'a rien ici,c'est qu'on commence à 0, donc si on commence à 0,après on a 1 et le 2 il est là, donc là effectivement
00:28:02 :on prend juste ces éléments ici.Le "-1", donc là effectivement après le "-3, 10",l'autre bonne réponse si je me souviens bien c'est le "-3, 10",non pardon, c'est le 0, "-3",alors 0, "-3", parce qu'on commence à 0,donc là aussi voilà, et "-3", donc on fait "-1,
00:28:20 :"-2, "-3", donc là encore il faut se direqu'on ne peut pas commencer à "-0",on a le 0 si vous voulez de la fin ici,donc dès qu'on va à "-1", on s'arrête ici,"-2, "-3", donc là effectivement aussion récupère ces deux-là. Et "-3, 10",
00:28:38 :donc là ça veut dire qu'on commence dans ce cas-ci à "-3",donc "-1, "-2, "-3", on commence là et aprèson va jusqu'à la fin, donc là on récupérait 3, 4, 5.
00:28:47 :Mais voilà, donc vous avez bien répondu,donc je ne vais pas trop m'attarder là-dessus.Ensuite, alors là on revient sur de l'orienté objet,alors je vais réduire un petit peu, là ça pique un peu,donc là c'est un autre type de question assez intéressant,les fameux selfs, donc là vous avez plusieurs options,
00:29:09 :souvent en fait, alors je n'ai pas réussi avec cet exerciceà mettre du vide, donc j'ai marqué vide,donc s'il y a des endroits où peut-êtreil ne faut rien mettre, donc si vous ne voulez rien changer,sélectionnez l'option vide,qui est comme si vous ne mettiez du coup rien,
00:29:31 :sinon vous avez la plupart du temps l'optionde choisir self, je crois que des fois il y a d'autres chosesque j'ai mis aussi, mais c'est principalement pour les selfs ici,je suis en train de réfléchir, je crois qu'il y a peut-être un autre endroitque self, mais voilà, donc là j'ai juste mis
00:29:46 :une minute,j'aurais dû mettre plus, je peux réinitialiser ça,donc là je suis en train de réfléchir,oui c'est ça, c'est vraiment tous les endroits où il faut mettreself pour que le script fonctionne,il n'y a pas d'entre deux,il ne faut vraiment pas en oublierni en rajouter,
00:30:36 :il faut vraiment mettre juste ce qu'il faut.Ok alors je ne sais pas si je reset le timer,ça ne va pas annuler les réponsesqui étaient déjà données.
00:30:49 :Ok, 6 sur 10,le 6,si tu sais ce que tu fais,oui c'est bizarre,maispourquoi j'ai mis une possibilité,oui,je me suis dit queoui, le 6,on est en train de donner la réponse un peu, mais oui le 6 c'est un piège,mais je me suis dit que quelqu'un pourrait se dire
00:31:31 :pourquoi pas mettre, puisqu'on appellesur l'instance, est-ce qu'on n'aurait pas besoin de mettrele self aussi sur la définition de la fonction ?On aurait pu penseravoir un mécanisme comme ça en se disantsi on veut faire une méthode de classe qui n'est pas liéeà l'instance, on ne met rien, et si on veut faire
00:31:53 :une méthode qui est liée à l'instance, on met self.le nom de la méthode, là dans ce cas-ci heureusementils ont fait plutôtle choix de ne pas avoir besoin de mettre self.
00:32:05 :sur le nom de la méthode. Ici on veut faire une méthode de classe,on peut utiliser le décorateur de classe méthode.Ok, donc plus qu'une personne, j'attends encorequelques secondes.
00:32:17 :Donc, réponses les plus fréquentes,là on a plein de choses différentes.8vides, ok.Ok, alors je ne sais pas si je peux afficherdes réponses correctes.
00:32:35 :Je ne peux pas afficher vos réponses individuelles.Les réponses les plus fréquentes,ok c'est pour le 1.Ah oui d'accord, je viens de comprendre.Je viens de comprendre ce que c'est par rapport à chaque numéro.
00:32:50 :Je pensais que c'était les groupes de réponses.Donc le 1, il y en a 2Avant, effectivement,dans les versions, je ne sais plus exactement quand est-ce que c'est devenuplus nécessaire, avant on était obligé d'hériter de la classeObject, ça fait vraiment longtemps, ça fait plusieurs annéesmaintenant qu'on peut faire juste une classe en mettant
00:33:12 :le nom de la classe 2.1 et c'est tout.Avant on était vraiment obligé tout le temps d'hériter de l'objectqui est l'objet de base dont hérite tous les objets.
00:33:21 :Maintenant il n'y a plus besoin de le faire.Ensuite, ici sur le init,oui il faut mettre le self, c'est effectivementc'est presque l'endroit le plus logiqueparce qu'effectivement sur des méthodeson n'est pas forcément tout le temps obligé de le mettre.
00:33:40 :Comme on disait justement à l'instant avec Gabriel, des fois on peut faire des méthodesde classe ou des méthodes statiques et là ça va pas forcément être self.
00:33:47 :Alors méthode de classe on va mettre CLS par conventionet méthode statique on va juste rien mettre parce que justementça va être une méthode qu'on va pouvoir appeler directement sur la classesans passer par une instance.
00:33:59 :Là dans ce cas-ci pour le init effectivement on est obligé de mettre le selfparce que justement c'est dans le initque l'on va manipuler, c'est l'endroit le plus logiqueoù on va manipuler l'instance vu que c'est là qu'on crée l'instance.
00:34:11 :Arnaud, on avait dit que c'était implicite.Oui c'est ça, c'est implicite effectivement.Une fois que l'instance est créée, t'es plus obligé de repasser le selfparce que là c'est effectivement ce qu'on disait l'autre fois.
00:34:26 :Une fois que t'as créé ton instance, là si je refais le moveon va faire juste move comme ça.Donc si je fais voiture01égale voiture, après tu peux fairevoiture.move et là tu vas faire self égale voiture01
00:34:47 :donc ça c'est la façon complèted'écrire le truc si tu veux où on voit bienpar contre c'est pas très pratique à chaque fois d'avoir passé par la classemais on voit bien qu'on passe l'instance à selfet que du coup ici si j'ai un self.marque
00:35:02 :marque égale marque c'est toutmarque égale marque comme çaet que là je dis marque égale Renault.Là on comprend bien avec cet exemple-ci que quand on faitvoiture.move et qu'on passe voiture à self
00:35:17 :et que là je fais un print de self.marquebah en fait ce self ici c'est voiture1donc on va afficher voiture1.marquedonc là on peut vraiment retracer très facilementle chemin. On a une voiture, on passe Renault
00:35:32 :à marque, la marque onla met ici et on la met dans self.marque et icic'est pour ça que je disais il y a quelques secondes quele init c'est vraiment l'endroit oùon a le self de la façon la plus logique parce que c'est là qu'oncrée vraiment cette instance.
00:35:50 :Donc là après on va faire voiture01.marqueon va dire que c'est égal à Renault et après du coupquand on fait voiture.move et qu'on passe voiture01 à un self
00:35:59 :bah là du coup c'est comme si on faisait voiture01.marqueEtvoilà je crois que c'est tout, il y avait un autre trucque je voulais dire mais je me souviens plus. Donc après
00:36:11 :bon voilà c'est assez logique 3, 4, 5si vous le mettez à un endroit vous le mettez à tous les autresdonc là on fait x égalex. Après je réfléchis
00:36:23 :là justement c'est ça qui m'avait fait un petit peu hésiterje me demandais si on mettait pas lesself ici est-ce que le script plantait ou non parce qu'on peut très biencréer une variable x qui est égale aux valeurs qu'on donne icipar contre après là où ça va planter c'est ici
00:36:38 :quand on fait le move. Si on met pas self.x icilà vous allez faire x plus égal 1et il va vous dire bah tu veux que j'ajoute1 à x mais x je sais pas ce que c'estdonc c'est vraiment parce qu'on va mettre self.x
00:36:53 :ici au numéro 3 que ensuite si on faitself.x plus égal 1 on peut ajouter 1à self.x qui existe déjà parce qu'il a été défini dans init
00:37:02 :mais si vous faites pas ce self.xlà on va créer une variable x qui va être une variable localequi va être dans la méthode init et qui une fois que la méthode initsera plus là on n'y aura plus Excelelle sera détruite par le garbage collectoret là de la même façon on aura une erreur parce qu'il va dire bah tu me dis
00:37:20 :x égale x plus 1 en gros ce qui est la façon raccourcie de fairex plus égal 1, enfin la façon longue de fairex plus égal 1 mais il va dire ajoute 1à x donc tu mets x égale x plus 1 mais x je sais pas ce que c'est
00:37:32 :tu ne l'as pas défini, là on l'a suppriméparce que dans le init c'était une variable locale et une fois qu'on sort du initon le supprime et là donc du coup je sais pas ce que c'estça c'est le même problème pour ceux qui ont fait un peu du Pythide
00:37:44 :si vous créez une fenêtredans une méthode, donc ça pour ceux qui n'ont pas fait de Pythideje peux vous expliquer rapidement en faitc'est un truc par exemple on fait createModalet on va créer une fenêtre modal ici avec Pythidequi va créer une autre fenêtre et le problème
00:38:02 :c'est que si on fait window égale newWindow comme ça par exempleet après window.showlà en fait la fenêtre va s'afficher et elle va disparaître directementparce que Python va exécuter cette méthodeil va créer la fenêtre, il va l'affichermais comme ici on est dans une variable, enfin comme on n'a pas fait
00:38:20 :self.window, une fois qu'on termine la fonctionle garbage collector il dit ok j'ai plus besoin de gardercette window en mémoire et du coup il va supprimerla variable et du coup supprimer la fenêtre, ce qui est un peu problématiqueet la solution à ça c'est tout simplement de rajouter
00:38:35 :un self, donc de faire self.windowparce que du coup ça va être attaché à l'instanceet tant qu'on n'aura pas fait del ici dans ce cas-ci voiture1tant qu'on n'aura pas supprimé l'instance il va pas supprimerla fenêtre ici qui est associée à l'instanceet c'est généralement dans ce cas de figure comme je vous disais qu'il va dire
00:38:53 :tiens attention là t'es en train de créer un attribut sur self mais tu l'as pasdéfini dans le init, donc fais gaffe parce que si par la suiteaprès tu fais des trucs sur self.window mais que tu l'as pas déjà créé
00:39:02 :effectivement ça peut créer des problèmesparce qu'il sera pas défini et on aura un attribute erreurok donc les 3 icieffectivement il faut mettre self, 3, 4, 5, selfensuite le 6 donc là comme on a ditpas besoin de mettre self.moveX
00:39:20 :c'est une erreur de syntaxe dans ce cas-ci parce que ça n'existe paspour le 7la plupart ont bien répondu aussion pourrait se dire justement dans un cas d'un autre scriptqu'on est pas obligé de le mettredonc si on met pas le self ici on n'y aura pas accès non plus
00:39:38 :à l'intérieur de la méthode et c'est logiqueet ça ça peut arriver si on fait du coupdonc là ça serait par exemple juste dans le cas d'une voiturequ'est-ce qu'on pourrait faire comme static methodje sais pas on pourrait dire afficherheure actuelleje réfléchis à un truc
00:40:00 :ouais je sais pas on pourrait faire une fonctionpour laquelle ça ferait du sens de la relierà notre classe voiture mais qui ne soit pas une fonctionqui va nécessiter de manipuler l'instancedonc une fonction générique qui n'aurait pas besoindu coup ici d'avoir accès au selfmais du coup on n'aurait pas le self non plus là dedans
00:40:21 :là dans ce cas-ci comme je l'ai dit on va modifier xdonc on a besoin du self.x ici et du coup on a aussi besoin
00:40:27 :de façonliée avec ça d'avoir le selfdans la définition et ensuite le self dans le 8 aussidonc là vous avez tous bien répondu et ensuite 9et 10 donc là videvous avez presque tous bien répondu aussidonc là quand on crée l'instance on n'a pas besoin de passer quoi que ce soit
00:40:48 :on fait juste créer l'instance là on a des valeurs par défautdonc on n'est pas obligé de passer des valeurselles vont être définies à ces valeurs par défauton pourrait les changer si on veut et le move.x
00:41:00 :c'est pareil ici on n'a pas besoin de passer l'instancedonc ça c'est ce qu'on disait avec Arnaud puisqu'on appelle déjàon aurait besoin si on faisait cube.movex
00:41:09 :là on aurait besoin de lui passer mon cubemais on n'aurait pas besoin de passer self ce serait directement l'instancequ'on passera ici dans ce cas-ci on mettrait self égalemon cube comme je l'ai montré dans le scriptici. C'est bon pour ça ?
00:41:24 :Ok superon continue la dernière questionça c'est la révision ultime et pendant que vous répondezje vais aller rechercher de l'eauun Python donc une classe permet de créer uneet là il faut remplir le texteune fonction est appelée à l'intérieur d'une classeest appelée une, une classe peut hériter d'une autre classe
00:41:54 :on part alors, celui-là il est facileun attribut de classe, donc là ça fait le tour un peu de tous les trucsje ne vais pas tout vous lire, je vous laisse regarder de votre côtéet remplir et pendant ce temps je vais me chercher de l'eauje ne vois pas encore de réponse, je pense qu'il va me les afficher
00:42:59 :quand vous aurez répondu à, il y a quand même 16 trucslà il y a pas mal de travaillà il y a pas mal de, ça fait un bon touren débutant, intermédiaire et un petit peu avancéil n'y a rien de très très avancéd'orienter objet mais il y a quand même quelques petits concepts
00:43:28 :à la fin dont on a parlé justementque vous pouvez deviner un petit peu aussi avec le texte autourmême si vous ne l'avez pas vu par rapport à ce qu'on a ditsi vous avez été très attentif parce que je ne l'ai pas dit beaucoupmais sur la fin il y a des petits trucs qu'on a vu
00:43:44 :je ne sais pas si vous pouvez soumettre votre réponsesi il y a des endroits où vous ne savez passi vous savez pas mettez non comme ça ça restera dans le thèmes'il n'accepte pas votre réponse sans mettre des trucs partoutpremière réponse, je ne vais pas l'afficher sinon ça risque de vous donner les réponses
00:45:13 :ah donc c'est ta réponse gaminje ne sais pas si tu peux pas modifier non ?une fois que c'est envoyé peut-être pasbon on va voirok ça commence à arriverça me semblait plus simple quand j'avais écrit le textelà j'avoue qu'en revoyantje vais vous préparer
00:47:36 :ok j'ai retrouvéArnaud il ne faut pas boire avant les menthorasok pas de soucis Axel je laisse encore 10 secondes 15 secondes terminerterminer si vous ne savez pas mettez rienalors et après on va voir çaouais t'inquiète Claudec'est pour ça que je conseille même des gens qui sont au tout début de venir
00:49:44 :parce que de voir toutes ces choses làmême si tu ne comprends pas tu vois des mots tu vois classetu vois visuellement à quoi ça ressembletu vois à quoi ça peut servir tu vois des conceptset quand tu vas retomber dessus après du coup dans les cours
00:50:00 :ça va pas être totalement étrangeet tu vas dire ah oui je me souvienset des fois tu vas voir un courset tu vas dire ça ça va vraiment faire des déclicsde pas être directement pour la première foisavec toute la syntaxe le pourquoi à quoi ça sert etc
00:50:15 :qui arrive tout d'un couplà ça sera un petit peu plus douxok donc on va s'arrêter làdonc les réponses les plus fréquentesok donc c'est çaok non là c'est pareildonc c'est bien faitdonc effectivement là parfait tout le monde a misdonc en Python une classe permet de créer une instance
00:50:35 :c'est ça une fonction à l'intérieur d'une classeest appelée une méthodealors une méthode pas une méthode de classeparce que dans ce cas-ciune fonction à l'intérieur d'une classequi s'appelle une méthode de classeça va être seulement si on met le at class méthodeclass méthode si je ne me trompe pas
00:50:52 :si je me souviens bienj'ai un petit doute c'est çaouais class méthodedonc là effectivement ça va être une méthode de classesi tu mets ce décorateuret ça te permet si je fais cls icide faire cls .
00:51:04 :de par exemple créer une instancec'est ce dont on parlait au tout début de la sessionavec Gab justementsur le fait que ça permet notammentc'est souvent utilisé pour créer des instancesd'une façon un petit peucomment direje cherche le motfactory un peul'exemple que je donne c'est sur les pizzas
00:51:26 :là Gab avaitpréfabriqué c'est un peu ça aussidonc avec des valeurs par défaut en faitqui permet d'évitersi on fait une classe là par exempleon pourra dire voiture françaiseet là on ferait unemarque égale Renaulton pourrait faire quelque chose comme çaet du coup si je me souviens jamais
00:51:48 :c'est quoi le nom de la marque françaiseje pourrais faire voiture .voiture françaiseou juste françaiseça serait mieux d'éviter la répétitionvoilà françaiseet là du coup on pourrait direcomme çaet là l'intérêt c'est d'avoir aussi l'autocomplétionparce que là je fais . et je peux dire
00:52:08 :qu'est-ce que j'ai comme optionça peut être aussi une façon de limiter les choseslà justement Gab ça peut répondre un petit peuaprès comme je te dis dans Djangoc'est un petit peu spécifiquedonc c'est plus restreintlà c'est vraiment quand tu utilisesquand tu fais une API
00:52:25 :un code qui va être utilisé par d'autres personnesaprès ça peut être un bon moyenaprès de justement direessayez pas de créer les chosesde votre façonil y a juste certaines marques qui sont disponiblesdans votre concession automobileanglaise ça va être quoiqu'est-ce qu'il y a comme marque anglaise
00:52:43 :je ne suis pas expert en voitureje vais faire les allemandsVolkswagen si je ne me trompe pasVolvonon c'est quoiles coccinelles c'est anglaisles mini je penseVolkswagen un truc comme çail doit manquer une lettre quelque partdonc là ça permet de se direje vais faire une voiture et là avec le point
00:53:09 :on a l'autocomplétion et on voit qu'on a justela française, l'anglaise et l'allemandeRover, Jaguarc'est anglaisdonc voilà ça permet comme ça d'avoir une façonunifiée de faire les choses sansjustement si les gens ne se souviennent plusils vont dire merdec'était comment déjà Volkswagenvous allez avoir des Volkswagen
00:53:29 :comme çaun peu bizarredonc voilà ça permet d'unifier les chosesdonchéritage c'est çacelui là il était facile on parle d'héritageun attribut de classe qui appartient à une instancedonc un attributde classe qui appartient à une instancespécifique c'est effectivementun attribut d'instancedonc là
00:53:55 :paramètres, objets, argumentsouaislà c'est vraiment entre les attributset les paramètresarguments ça a vraiment à voiravec les fonctions et les méthodesen sachant qu'on peut aussi direqu'une méthode est un attributparce que les attributs finalement c'est tout ce qui appartientà l'objetdonc ça peut être aussi
00:54:19 :on peut dire qu'une méthode va êtreenfin qu'une classe va avoirdans ses attributs les méthodes égalementmais là c'est ça, c'est bien l'attributd'instancebon je ne sais pas si je peux affichertout d'un coup comme ça aussiouais ok ça sera peut-êtreok wow il me fait un petit
00:54:39 :wow il fait un revealet là je ne peux pasc'est un peu mal fait ce leur trucje ne suis pas 100%donc ouais ok ça sera plus claircomme ça pour vous de tout voirest un attribut d'instance tandis qu'un attributmais ok bon je ne sais pas en fait
00:54:55 :je vais revenir là-dessus parce que j'aime bien voir vos réponsesc'est intéressant de voir qu'est-ce que vous avez misdonc la fonction spécialequi initialise les nouveaux objets s'appellele constructeur, effectivement vous l'avez bien misinstancefonction contrôleur presqueil y a l'idéeet souvent définie par la méthode init
00:55:13 :c'est bon, alors c'est pas la méthode nodedonc nonc'était pasje pense que vous avez pu mettre videpeut-être c'est ça le vide je ne sais pasdonc initc'est ça, bon là j'imagineenfin voilà faut vraimentpas oublier, si vous mettez juste initsans les tirer du bas ça ne va pas être bon
00:55:35 :je ne sais pas si c'est un oubli ou si c'est justevoilà la personne qui a mis çaa mis le nom sans forcément mettrela représentation exactedans le codesouvent définie par la méthode initpar le biais d'une instance le mot clé selfeffectivement dire ça permet d'afficher
00:55:51 :tous les attributs justement d'un objetpour permettre la redéfinitionon parle de surchargedonc là effectivement attention, pas confondresurcharge avec le polymorphismele polymorphisme c'était celui d'aprèsdonc là on a eupas mal, là ça commenceà divergerdonc l'encapsulationnon je crois que c'était celui d'aprèsoui justement, donc là il y a peut-être
00:56:15 :quelqu'un qui a tout décalé d'une réponsedoncla redéfinition d'une méthodedans une sous-classe, donc ça effectivementc'est la surcharge, c'est si vous avezdonc là dans ce cas-cisi on a, on va avoir par exempleune classe voiture qui va avoirje sais pasavanceet que par défaut on va dire
00:56:37 :print ça avance vitevoilà des exemples incroyableset si on prend justement uneJaguar, je sais pas si ça va très vite, on va prendre une Ferrarilà je peux justementredéfinir en disant ça comme çaet là on va dire ça avancevraiment très viteet donc là du coup
00:56:55 :là c'est la même chose d'ailleursque si je fais une voiturequi égale à Ferrarisi je faisvoiture.avance, c'est la même chose qu'avecles attributs, dans le sensqu'il va déjà regarder au plus prochede l'instance, donc il va regarderok là cette voiture là, cette instance là
00:57:13 :elle a été créée avec Ferrari, doncje regarde, est-ce que j'aiune méthode avance sur ma Ferrarioui ok, bah j'utilise celle là et je vais pasplus loin, si j'en ai pas icihopsi j'en ai pas ici, mais que on héritedeux voitures ici, ah oui j'avais oublié l'héritage
00:57:29 :quand même dans ce cas-ciparce que là du coup c'est ça qui est intéressantc'est que c'est ça qui fait qu'on a une surchargesans ça si j'ai pas l'héritagec'est pas une surcharge, c'est juste voilà j'ai deuxdeux classes séparéesqui ont le même nom de méthodemais on surcharge rien
00:57:45 :par contre si je fais làun héritage avec voiture, là on vaécraser d'ailleurs, c'est ça que je vous montre icilà le petit, je sais pas si il me met un tool typevoilà, override methodin voiture, donc là il me le dit, ça va justementécraser la méthode qui
00:57:59 :est définie ici, et là justement si jelaisse aussi, isOverriddenin, et là ça va me dire où est-ce quec'est surchargéle principedifférents objetsoui ok, oui non c'est ça, polymorphisme, on va le voirjuste après, et justementavec une autre question là que je vous ai retrouvée
00:58:21 :d'un étudiant qui était bien là dessusdonc voilàlà on va surchargeret on peut utiliser là encorele super pour dire ok je veux utiliserlele comportementpar défaut de avance, donc là avecle super on va en fait appelerla méthode de la classe dont on hérite
00:58:41 :dont on hérite, pas dont onhérite, ok, dont on hériteetsuper.avance du coup ça va déjàexécuter çaet ensuite on vaexécuter le code de notrefonction ici, donc ça permet d'avoirles deux, mais on peut aussijuste redéfinir complètementla méthode comme çaet après effectivement
00:59:05 :donc là c'est lasurcharge, exactementici dans le 9le principe qui permet de traiter différents objetspar le même code est appelé, et làc'est le polymorphisme, effectivementdonc il y a deux personnesok c'est ça, il y a une fautede syntaxe ici mais c'est çaet le polymorphisme, je vous ai
00:59:25 :trouvé cette question icipour en parlertac, doncle polymorphisme, voilà, là on a un bonexemple, je vais grossir un petit peud'un étudiant qui demandait, voilà, ça sert à quoien fait de mettreavance partout, parce que finalement là sije fais super.démarre, donc là justement on va
00:59:43 :démarrer notre véhiculeavant de le faire avanceret on va avoir ici avancedans les deux cas, donc dans notre voiturequi hérite de véhicule et dans l'avionon va déjà démarrer le véhicule et ensuiteon va avoir avance ici sur la voitureou sur l'avion, donc effectivementet donc après ce que je disais c'est que
01:00:01 :si par contreon fait des noms différentspour chaque classealors là d'ailleurs j'ai pasouais alors là j'ai, ouic'est ça justement, oui c'est çac'est ce que je me disais, il me semblait bien que je l'avais mis dans ma réponseque c'est même pasforcément en lien avec l'héritage
01:00:19 :dans le sens où là vous voyezqu'on a, tiens d'ailleurs il y a des espaces iciqui n'ont rien à fairedonc si on atrois éléments iciun bon exemple aussique je montre souvent c'est avec Djangojustement je vais revenir aprèslà le problème c'est qu'on a trois
01:00:37 :élémentsqu'ils héritent l'un de l'autreou non, c'est pas forcément çale point important ici c'est qu'on atrois éléments qui sont assez similaireson a des véhicules, on a une voiture, un avion, un bateauet là vous voyez on pourrait se direok je vais créer tous ces éléments et après
01:00:53 :tous ces éléments ils vont avoiron va leur faire faire des comportements similairesdonc dans ce cas-ci on va les faire avancerle problème c'est que làon s'est dit en créant le code, on s'est dit bah la voitureelle vole pas, elle roule donc on va faire une fonction
01:01:05 :roule, l'avion il voleon va faire une fonction vol et le bateau il flotteon va faire une fonction flotte. Le problème c'est qu'aprèssi on veut faire avancer tout d'un couples uns à la suite des autres avec le fourbah là on est obligé de vérifierest-ce que je suis avec un véhicule
01:01:19 :oui ok je vais appeler véhicule.rouleest-ce que je suis avec un avion je vais appelervéhicule.vol, si je suis avec un bateauje vais appeler véhicule.flotte
01:01:27 :donc c'est pas pratique ça fait du code à rallongeet ça nécessitede savoir aussi parce qu'on pourrait se direbon okla voiture on pourrait mettre rouleon pourrait mettre avance justementdonc ça nécessite d'allertoujours voir quand on va utiliserun autre véhicule quel est le verbe
01:01:45 :qu'on a décidé d'utiliser pour faire avancerle véhicule. Alors que si là on metun terme génériqueavance, on définit dans l'équipevoilà quel verbe on va utiliserpour tous nos véhicules pour dire qu'il faut qu'il démarrebah on va utiliser avanceet dans ce cas-ci vous voyez que la boucle est super simple
01:02:01 :peu importe le typejustement et c'est la fameuse phrasedont on entend souvent parlerquand on parle de polymorphismec'est en anglaisif it looks like a duckalors je ne sais plus exactementsi ça fait du bruit comme un canardsi ça marche comme un canardsi ça je sais plus quoi comme un canard
01:02:21 :c'est que c'est probablement un canarddonc l'idée c'est de dire queon pourrait le faire avec le véhiculesi ça ressemble à un véhicule même s'il y en a un qui a des ailesmême s'il y en a un qui flotte etcsi ça ressemble à quelque chose qui peut avancer
01:02:33 :si ça ressemble à quelque chosequi peut permettre de se déplacerc'est probablement un véhiculeet donc là dans ce cas-cion a ces trois éléments làqui ont tous la méthode avanceet on n'a pas besoin de savoirs'ils flottent, s'ils volent ou s'ils roulenton peut l'appeler sur tout ça
01:02:51 :et je reviens sur l'exemple de Djangopar exemple c'est un trucj'ai littéralement eu ce problèmedans mon code au départsur docstringsi on pense pas trop à çac'est un système classiqueje sais pas si dans ce cas-cion pourrait vraiment parler de polymorphismeje réfléchis un petit peu mais c'est quand même
01:03:11 :la même idéedonc vous allez faire des différentsmodèles et je parle de Django mais ça peuts'appliquer justement à un peu toutdonc vous allez faire un modèleblog post justementqui va hériter de models.models
01:03:25 :et là vous allez diredans mon blog je vais avoirun titlemodels.charfieldpar exemple, ensuite vous allez avoirune description, models.textfieldet après vous allez faire une formationvous allez faire une formation et comme je vous dis c'est 100%ce qui m'est arrivéet après vous allez dire
01:03:45 :une formation ça va être un nom, ça va pas êtreun titre, donc là on va faire un charfieldcomme çala descriptionça va êtreon va mettre des fois short descriptionparce qu'on se dit ok dans ce cas-ci ça va être une petite descriptiondonc on va mettre un charfield
01:04:01 :aussi ici et le problème c'estqu'à un moment vous vous retrouvez avecun tableau de bord dans lequel vous voulez afficherune carte avecle dernier élémentlà je vous parle vraiment de vécuet que vous avez vécu aussi avec docstringil y a une carte où c'est continue ton apprentissage
01:04:17 :tu cliques et il y a à chaque foisle nom de l'élément sur lequelvous vous étiez arrêté et la descriptionet le problème c'est que là du coup on est obligé de fairesi le dernier élémentdonc en gros si je le fais en pseudocodec'est si le dernier
01:04:31 :élément visionnéest un article de blogalorson affiche titreet descriptionsi dernier élément visionnéformationalors on affiche nameet short descriptionet làune façondu coup de pallier à çasans changerparce que là ça peut être problématiquede changer tout le modèle de votre base de données pour ça
01:05:01 :ça peut causer des problèmes et ça c'est un trucqu'on voit très souvent aprèssi justementça va d'ailleursavecun peuavec le terme qu'on va voir juste aprèsd'encapsulation justementque l'encapsulationpermet d'éviter ça aussi des foisen ayant des attributs qui sont privésdonc de l'autre côté on fait notre tambouille
01:05:25 :et après on donne quelque chose de disponibleaux gens qui vont utiliser notre code et si jamaisça change en interne ça va pas changer en externedonc comme ça ça permet de changer des chosesdans le fonctionnement de notre code à nouset de pas avoir à dire à tous les clients qui utilisent
01:05:37 :votre code attention maintenant c'est plus nameet short description mais c'est très tôt les descriptionsdonc là par exemple ce qu'on pourrait fairec'est justementse dire que de basepeut-être que ces noms là pour une raison ou une autreon va les garder comme ça et qu'ils vont changer
01:05:51 :mais qu'après en fait on va directementfaire icidonc là on pourrait faireun get nameet là dans ce cas-cion retournerait self.namecomme ça etici un get descriptionon pourrait le faire avec une propriété aussile problème c'est que là si je fais unname comme ça en propriété
01:06:13 :dans ce cas-ci avec un élémentqui a déjà justementun field qui s'appelle name ça va causerdes problèmes donc là on pourraitimaginer un get name, get descriptionet là return self.short description
01:06:25 :et là du coup on aurait pareilmême chose et donc là on revientsur cette idée de polymorphismeoùfinalement on va toujours utiliser get namedonc polymorphisme encapsulationvous voyez selon ce qu'on fait, ce qu'on ditdonc tout ça c'est toujours un petit peulié, l'idée c'est de pouvoir
01:06:43 :faciliter l'utilisation du code et de pas avoirde pas avoir des choses comme jedisais où il va falloir dire à tous vos clientsbah maintenant en fait changez la façon de faire parce qu'on l'achangé donc ça permet demodifier les choses ou alors de faciliter pour dire
01:06:55 :à votre client bah regarde t'en fais pas peu importesi c'est un blog, une formation etctu vas toujours utiliser get name, get descriptionet après nous de notre côté on gèrela base de données et si des foison a fait des trucs comme ça en mettant name, title
01:07:07 :le mieux des fois c'est quand mêmepour des trucs comme ça comme je vous diraisc'est de se dire bon bah okmême si sémantiquement c'est pas génialde dire name pour un article de blogc'est pas vraiment le nom d'un articlemais plus le titre, bah vous mettez name quand même
01:07:21 :et comme ça vous avez pas besoin de faire des chosescomme ça, de toute façoncomme je vous dis c'est souventune pratique qu'on voit de même si vous avezname ici, même sijustement on peut l'utiliser directementça vaut le coup de fairede l'encapsulation comme ça, donc là dans le cas de Django
01:07:37 :ou avec des attributs privés si c'est juste duPython pur, pour se dire bahpeu importe en fait même si on amis name partout et description icisi jamais ça venait à changerpour une raison ou une autre par la suiteon va dès le début créercomme ça des méthodes qu'on va dire à tout le monde
01:07:53 :d'utiliser, comme ça si jamais par la suiteon a un problème et queon doit renommer ici titleça va pas poser de problème parce qu'on aura juste besoin de changerici le name pour titleet tout notre code, nos clients etcvont utiliser getName et du coupça posera aucun problème. Donc voilà
01:08:09 :pour ces concepts là qui sont quand mêmedu coup très important à comprendreà maîtriser parce queça fait beaucouppour la maintenance du codeet oui c'est une bonne suggestionGabriel, il y a plein de choses que je pourrais diresur DuckStream, j'y pensais, je vais fairedes vidéos là dessus sur la stack, tout ça
01:08:27 :Doncle principe qui permetdonc ça c'est polymorphisme, le 10un mécanisme pour empêcher l'accès aux attributsd'une classe, donc ça ça s'appelle l'encapsulationeffectivementdoncça permeton a des attributs qui vont être privésqui sont jamais 100% privésmais qu'on va encapsuler justementet que c'est exactement ce que je viens de vous dire
01:08:51 :avec le getName par exemple qui permetd'utiliser quelque choseà la place de l'élément de basevous utilisez une fonction intermédiairequi va retourner l'élément que vous avezvraiment en back-end et c'est plussimple comme ça pour la maintenanceLorsqu'une classe dérive de plusieursclasses on parle, celle-là elle était pas forcément
01:09:09 :héritage multiple, c'est bienc'est pas juste de l'héritagej'ai mis dérive, c'est çaj'avais changé un petit peu pour pas que ce soit dans lecomme ici avec la réponsedans la question presquedonc voilà, une méthode qui appartient à une classemais qui n'agit pas sur les instances là
01:09:25 :c'est effectivement une méthode de classec'est ce que quelqu'un avait répondu ici qui était fauxmais là c'est bien le cas parce qu'elle appartient à une classemais elle n'agit pas sur les instancesdonc c'est le classMéthode et elle est souventmarquée par le décorateurclassMéthode. A l'inverse donc
01:09:39 :une méthode qui ne nécessiteni référence à la classe ni à l'instancec'est une méthode statiqueelle est décoréeavec staticMéthode sans le Eparce qu'on est en anglais. Donc voilà
01:09:51 :pas mal quand mêmevous avez trouvéil y a au moins une personne qui a trouvé les bonnes réponses à chaque foiset je sais pasil peut pas me mettrepeut-être que de votre côtévous avez un meilleur aperçude j'imagine ce que vous avez eu de bon
01:10:07 :ou de faux. Doncvoilàinstance ouais c'est çaje regarde lesouais à la fin ça commençait, ouais c'est çaplus on avançait plus c'était un petit peu durokdonc voilàje pense que ça fait le tourça fait déjà 1h10 qu'on parledonc on a pas eu le temps
01:10:29 :de faire d'exercices spécifiqueson va se réserver ça pour une autre foismais je pense que ça quand mêmefait pas mal ded'exercices en soi avec tout çale 3l'héritageouais en fait c'est çac'est que finalement c'étaitpeut-être trop évident donc en fait on cherchaitun autre truc qu'héritage
01:10:51 :peut-êtreouaisla classe abstraite on va rentrerdans les choses un peu plus avancées effectivementmaisça pourrait être intéressanteffectivementdonc est-ce qu'il y a des questionssur tout ce qu'on a vudes doutesdes chosesqui étaient pas clairesouaisAxelouaistu m'entends ?
01:11:27 :ouais c'est bonoui en fait j'ai une question plus globalegénéral c'est sur WCLAP c'est la première fois que je le voiset j'aurais voulu savoirsi je peux le faire en revoyanten visualisant la vidéopar la suite, est-ce que je peux retourner sur WCLAPavec le code
01:11:43 :oui oui oui je crois parce quejustement je me suis rendu compte la semaine dernièreque celui-là était encore marquéactifc'est un code unique, tant qu'il est actifje pourrais le refaireouiattends là je regarde, il est plus marqué comme actifouais c'est çaje vais regarder mais
01:12:03 :couper le lien directje sais pas, je vais regarder mais ouaisce serait pratique effectivement pour que vous puissiezc'était juste pour savoir, pour le refaireouais ouais c'est une bonne idéemême pour ceux après qui sont en rediffusionaussi ça peut être super cool de pouvoirje vais regarder ça mais je suis quasiment sûr que c'est possible
01:12:23 :parce que comme je te dis la semaine dernièrej'ai vu que lui était marqué encore actifpourtant j'avais fermé l'interfacedonc c'est sûr quec'est possible d'une façon ou d'une autreje vais regarder çapeut-être si je le relanceque jedésactive çaouais là c'est pas ferméok ouais il y en a qui ont des
01:12:47 :timersouais je vais regarder çaje vous tiendrai au courantsur discord ouais c'est bonmerci beaucoupok ouais là il me relance le timerouais je vous tiens au courantd'autres questions ?
01:13:11 :...bon bah et biens'il n'y a pas d'autres questionson va s'arrêter làdu coup et je vous tiens au courantdu coup pour le wooclapet la rediffusion sera disponibled'ici quelquesd'ici une heure à peu prèsnormalementon a mis aussi d'ailleurs les événements discord maintenant
01:13:45 :sur docstring si vous voulez aller voirc'est un peu plus organiséhop docstringdans lesévénements icidans les rediffusions vous avez plus de tagsici affichés uniquement les événements discordil y a eu des trucs assez sympasil y a eu une introduction de code qui a été cool
01:14:05 :il y a Axellesi je ne me trompe pas Alexqui a fait une initiation aussiavec Visual Studio Codeje sais pas si c'est déjà là dessus mais ouaisn'hésitez pas à aller voir c'est des trucs un peu intéressantset ouiles événements à venir comme le 7 juin
01:14:24 :effectivement sont affichésmaintenant aussi normalementouais c'est ça sur le planningdonc il y a effectivement les Djangoformulaires présentés par Gabriel ici présentça va être très cool avec lescrispyforms donc si vous êtes intéressépar Django n'hésitez pas il y a dudeep learning, du crypto jacking
Aucune occurrence trouvée pour « ».
00:00:14
Question de Gabriel sur les @classmethod avec Django
00:07:30
Première question orienté objet
00:10:52
Deuxième question orienté objet (attributs d'instance et de classe)
00:15:35
Question de Sylla sur les attributs
00:24:12
Troisième question sur les slices
00:28:55
Quatrième question orienté objet : ajouter les self
00:41:33
Cinquème question orienté objet : terminologie (texte à trou)
00:56:28
Explication de la surcharge
00:59:32
Exemple et explication sur le polymorphisme
01:03:03
Encapsulation et exemple avec Django