Session du 11 mars 2025 à 21h00
TOSA & Certifications
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
Maîtriser les décorateurs de méthode Python
Exploration pratique des décorateurs @classmethod et @staticmethod en Python, illustrée avec une classe Voiture et des exemples concrets d’utilisation.
00:00:00 :Ok, c'est bon, ça enregistre.Alors, rebonsoir à tous pour ceux que j'ai oublié de saluer à l'arrivée.Donc ce soir, comme vous avez pu le voir,c'est dommage parce que Pascal n'est pas là,parce qu'il m'avait demandé de faire un petit truc sur les décorateurs.
00:00:19 :Alors, les décorateurs en Python, c'est vrai qu'on les voit,ce que je disais tout à l'heure, rapidement dans le cadre de la formation.Ah, ben voilà, il a fallu que je l'invoque, et Pascal est arrivé.
00:00:35 :Salut, Pascal.Je venais de t'invoquer, je vois que tu es arrivé.Donc, je disais les décorateurs.Effectivement, pendant le cadre de la formation,les décorateurs, généralement, vous voyez les deux décorateurs classiquesdans la programmation Objet, le Cast Method et Static Method, d'accord ?
00:01:04 :Oui.Alors, on va revenir là-dessus.Voilà, je supprime tout ça.Alors, on va faire comme ça.Ok.Hop là.Est-ce que ça, c'est gros pour vous au niveau de l'écriture ?
00:01:41 :Oui, un peu.Oui, très bien.Donc, je disais le décorateur classe méthode et le décorateur static méthode.Alors, est-ce que vous vous rappelez déjà ce que font ces deux décorateurs ?
00:01:57 :Effectivement, non.Alors, le classe méthode, il va être le plus souvent utilisé pour invoquerl'instance de la classe qu'on aura préparée à l'avance.Alors, pour ça, je ne vais pas être très original.
00:02:11 :Je vais reprendre l'exemple que Thibault donne dans le cours avec la fameuse classe voiture.Voilà.Donc, on l'initialise avec trois attributs.Alors, on a dit self marque.
00:02:36 :Self vitesse égale vitesse.Donc là, je fais des fautes de frappe.Ça, on ne va pas le faire.Et self point prix égale prix.Ok.
00:02:52 :Je vais passer mes arguments ici.Ok.Et donc, c'est ça.Et je peux par exemple définir une Lamborghini en disant que ma Lamborghinic'est un sélecteur.
00:03:28 :Voilà.La voiture.Alors, Lamborghini.Hop, 180.Allez, 180.200 000.Hop là.Donc là, en rajoutant mon fameux décorateur classe méthode,ça me permet d'utiliser ma classe en faisant tout simplementLambo égale voiture point Lamborghini, sans passer à aucun paramètre.
00:04:19 :Voilà.Je vais appuyer énormément ça pour renvoyer le str de base.Voilà.Et là, si je lance, on voit bien qu'il m'a bien créé un objet voiture.
00:04:30 :D'accord.Donc ça, l'utilité principale, c'est de pouvoir créer des objetsqui correspondent aux instances qui correspondent à la classe,qu'on sait qu'on va réutiliser souvent.
00:04:39 :Et pour ne pas avoir à les créer à chaque fois, on les crée directement dans la classe.Et avec une classe méthode, on va pouvoir récupérer les instancesqu'on a préparées avant même de lancer le programme.
00:04:51 :Ok.La deuxième méthode qu'on vous montre dans la formation, c'est la méthode statique.Alors, la méthode statique.Le principal avantage, c'est que je vais écrire une méthode dans ma fonction.
00:05:10 :Vous allez tout de suite me dire, mais il manque quelque chose.Hum.Hum.Il me manque quelque chose.Je vais commencer par la bande touche.
00:05:54 :Ok.Je crois qu'il me manque... Non.Il ne veut pas me le faire.Attendez, j'ai un petit problème de rébellion de l'ordinateur.Il ne veut plus me faire les...
00:06:20 :C'est les braquettes, si tu veux qu'on te fasse les briquettes.Il ne veut plus me faire les braquettes, alors pourquoi ?Attendez, je vais voir si c'est revenu. Je les ai mis dans le chat, si tu veux.
00:06:29 :Je vais les prendre dans le chat, parce que je ne sais pas pourquoi il ne veut pas me faire les braquettes.Alors, s'il ne fait pas les braquettes, ça risque d'être un peu long la soirée, mais ce n'est pas grave.
00:06:36 :On va se débrouiller. Merci, artiste.Ouais, bon, c'est tout.Voilà.Normalement, ça va marcher comme ça.Est-ce que déjà, dans ma méthode, il n'y a pas quelque chose qui vous choque par rapport à la programmation avec les objets ?
00:07:12 :Il n'y a pas de self, il n'y a pas de CLS.Voilà. En fait, les méthodes statiques, c'est des méthodes qui sont propres à la classe,
00:07:19 :c'est-à-dire qui permettent d'utiliser des objets de la classe ou des méthodes de la classesans avoir besoin de passer un objet au préalable.D'accord ? Donc ça, c'est le décorateur statique méthode.
00:07:35 :Vous voyez, il me recrée bien mon objet, il n'y a pas de souci.Donc maintenant qu'on a vu ce que faisaient les décorateurs et les deux décorateurs que vous voyez le plus souvent,l'intérêt, c'est de savoir qu'est-ce que c'est qu'un décorateur.
00:07:48 :Parce que là, je vous montre un petit peu comment ça fonctionne, je vous montre un petit peu ces deux décorateurs-là,mais il n'y a pas que ceux-là, on va très loin de là.
00:07:56 :Et ce que je vais vous montrer rapidement, surtout, c'est que vous allez pouvoir créer les vôtres, le décorateur.Parce qu'en fait, un décorateur, c'est ni plus ni moins qu'une fonction qui englobe une autre fonctionet qui lui rajoute des éléments.
00:08:15 :Alors, je vais vous montrer ça de manière un peu plus pratique.Admettons, alors comment je commence ?Voilà, je vais d'abord vous faire une petite fonction là, en bas volontairement.
00:08:31 :On va l'appeler question, peu importe.Et on va simplement lui faire appliquer.Voilà, et on va en faire une deuxième pour que vous voyez bien le truc.
00:08:51 :Par exemple, donc voilà, deux fonctions extrêmement bêtes.Donc, je vais les mettre ici.Donc, si je lance mon script, on est d'accord, il m'affiche, est-ce que ça va, où habites-tu ?
00:09:34 :Donc, pour l'instant, rien de bien transcendant.Maintenant, on veut rajouter d'autres éléments à cette fonction.Et bien, on va créer un décorateur. Alors, comment on va faire ça ?
00:09:52 :Le décorateur, je vous ai dit, c'est une fonction.Donc, on va l'appeler bonjour.OK.À l'intérieur de cette fonction, alors là, le nom est arbitraire, mais généralement, on l'appelle comme ça.
00:10:07 :Je vais créer un wrappeur.Je vais lui dire de rajouter une phrase.Hop.Voilà.Et là, je vais lui faire passer la fonction qui est en paramètres.
00:10:37 :D'accord ?Bon, ne vous intéressez pas trop et ne vous attachez pas trop à la manière dont on construit le décorateur,c'est vraiment pour que vous compreniez l'intérêt du décorateur.
00:10:50 :Après, si vous voulez aller plus loin sur comment fonctionne la création de décorateur et ainsi de suite,il y a Thierry qui avait fait un live il y a quelques temps sur le sujet qui est extrêmement completet je ne voudrais pas avoir les mêmes connaissances que lui à ce niveau-là.
00:11:05 :Donc là, je vais rajouter mon décorateurà ma fonction question. D'accord ?Je vais dans ces questions.Et là, vous allez voir que le fonctionnement de ma fonction question a changé.
00:11:30 :Qu'est-ce qui ne va pas ?Oui, je ne l'ai pas sur le mauvais endroit, la fonction. Pour moi, c'est pour tout à l'heure.Voilà.Qu'est-ce qui ne va pas ?
00:11:48 :Qu'est-ce que j'ai fait comme bêtise ?Ah, oui. Je crois que c'est ça qui m'embête.Pourquoi est-ce qu'il faut mettre parenthèses, parenthèses ?Attends, c'est de comprendre où j'ai fait ma bêtise.
00:12:23 :En plus, je les ai préparées cet après-midi, les trucs. Je vais regarder comment les faire.Neuf questions là.Qu'est-ce qui ne lui va pas ?
00:12:52 :Ah, zut. Excusez-moi, je vais aller revérifier un truc parce que là, je ne comprends pas le pourquoi.Désolé.Désolé pour ce petit couac.Il n'y a pas de retour par hasard, Stéphane.
00:13:29 :Ah, à mon avis, c'est ça.Voilà.Je pense que ça vient de là.Ah, purée, ce n'est pas vrai.Il n'y a peut-être pas les parenthèses après le funk.
00:14:00 :Il n'y a pas les parenthèses après le return.C'est return funk sans parenthèses, je crois.Le return rapper.Je pense que c'est mon funk et return rapper. C'est bien ça, je pense.
00:14:13 :Même sans le funk, aussi avec le funk.Et les parenthèses.Et le return, il faut qu'il soit en dehors du rapper.Voilà. Hop.Et voilà, on y arrive.
00:14:29 :Mais par contre, mon funk, du coup, il faut qu'il soit avec les parenthèses.Voilà. Ça y est. On reprend le truc.Désolé pour cette...OK.
00:14:42 :Donc là, vous voyez ce qui s'est passé.J'ai ma fonction de base qui a imprimé simplement « Est-ce que ça va ? ».D'accord ?
00:14:54 :Et du fait d'avoir mis ce décorateur,j'ai envoyé ma fonction en paramètres dans une nouvelle fonctionqui a d'abord exécuté les choses,et après exécuté la fonction que je veux passer en paramètres.
00:15:06 :Alors vous allez me dire comme ça,l'intérêt n'est pas prégnant,autant mettre directement la phrase « Bonjour les membres de Dope Street »directement dans notre première fonction.
00:15:18 :Et puis voilà.Sauf que du coup,je remets mon décorateur,je vais exécuter ma fonction lieu,et je relance.Et là du coup, ma phrase « Bonjour les membres de Dope Street »s'est exécutée dans chaque fonction.
00:15:43 :Donc l'intérêt des décorateurs, c'est que vous allez pouvoir...Voilà.Là vous allez pouvoir, du coup,faire des fonctions,ajouter des petits effets sur vos fonctions,pour pouvoir les répéter plus loin.
00:16:09 :Ça va vous faire gagner du temps en termes de code.Donc je vais vous montrer, je vais le modifier celui-là en faisant autre chose.Excuse-moi, là je comprends bien,mais pourquoi il y a besoin de mettre le DevWrapper à l'intérieur ?
00:16:21 :C'est utile ?Le DevWrapper, c'est un enveloppe,qui va packager la fonction d'originedans une nouvelle fonction.C'est pas ce que fait le décorateur tout simplement ?
00:16:39 :Alors le décorateur comme ça,si tu ne fais pas ce genre d'application,ça ne va pas te le faire forcément.D'accord ?Ce qu'il faut savoir, c'est que ça va permettre d'utiliser la fonction qui est passée en paramètre.
00:16:54 :En fait, techniquement,si j'avais fait à la place de Func,j'avais mis un Print,est-ce que ça va ? Ça aurait été la même chose.
00:17:06 :Là le Wrapper, c'est ce qu'il va faire.Il va envelopper et prendre ce qu'il y a dans la fonction Func,l'envelopper et l'exécuter comme une seule et même fonction.
00:17:15 :Ah oui, d'accord.Donc à décorateur, il y a toujours deux Def alors ?Voilà.Et je te spoil, mais tu vas voir qu'il peut y en avoir trois.
00:17:27 :Ah, ok.Donc Jean-René,je vais vous mettre un autre exemple qui vous semblera beaucoup plus pratique.Un truc que vous avez peut-être pu faire au cours de vos différents scripts,c'est de monitorer le temps que mettait votre fonctionà se réaliser.
00:17:45 :D'accord ? Pour voir si vous pouviez optimiser,ou si vous aussi...Hop, alors on va fairedot timeVoilà.Donc, on va pouvoir faire notre startégaledot time point dot time pointNow, okmon end égale dot time pointdot time pointNowOk, et printend moins start
00:18:35 :Voilà. C'est le timer basique.Ok, bon là, les temps vont être, bien sûr,extrêmement courts.Ah oui.Si je change la fonction, je ne mets pas le nomdudécorateur. Voilà.
00:18:58 :Vous voyez là, les temps sont extrêmement courts.Maintenant, si je simule une action longueje vais refaire undot time point dot time pointdot sleepAh non.
00:19:17 :Allez, 15 secondesOuais, c'est pas ça.Je vais essayer de modifier le temps.Hop là, import timeVoilà, ça a bien marché.Je relance la fonction.
00:19:40 :Ah oui, je n'ai interrompu pas.Donc là, ça va durer.Voilà. Là, on voit bien qu'il y a le temps de 4 secondesqui s'est écoulé le temps que ma fonction réalise.
00:19:52 :Donc, ma fonction s'est réalisée en 4 secondes et cake.Ok. Donc là, par exemple, dans vos scriptsun petit truc que vous pouvez vous fairevous mettez, vous faites un petit décorateur comme ça par exemplede timer et ça vous permet à chaque fois que vous voulez vérifierle temps que met une fonction à s'exécuter
00:20:10 :vous la décorez avec votre timer.Ok. Et puis là, du coup, vous pouvez mesurerle temps que votre fonction a mis à s'aléser.C'est bon pour tout le monde? Ou j'ai perdu des gens?
00:20:24 :Non, c'est bon.Oui, ça va, ça va.Alors, maintenantla petite astucec'est que comme c'est une fonctionje la remodifie encoreon peut lui passer forcément des arguments.
00:20:47 :Je vais revenir sur ma version bonjourHop!Si je ne me trompe pas, c'est dans cet ordre-làça, on n'en a plus besoinHop là!
00:21:10 :Ok.Ça va?Décidément, il faut que j'aie un souci techniqueà chaque fois quevoilàOk.Je fais une présentation.Je dois être mort à aboutir.
00:21:52 :Je ne sais pas.Hop là! Alors, en espérant que je ne me suis pas trompéparce que celle-là, j'ai toujours un peu de malà me retenir l'ordre dans lequel ça se faitTac, tac, tac, tac, tac, tac, tac, tac, tac, tac, tac, tac, tac, tacTac, tac, tac, normalement c'est bon
00:22:16 :Bon, je vais passer celle-là parce qu'elle ne sert plus à rien maintenantVoilàOn va laisser questionOk. On va enlever ce timeslip qui est inutile maintenant
00:22:37 :Voilà. Normalement, je ne devrais pas être malVoilà. Je m'en doutais. C'est l'inverseVoilà. C'est comme ça qu'il faut que je fasseBonBon. Alors, attendez
00:23:24 :Ah! Décidément, ce soir, je n'ai pas de chanceOkJe vais monter çaVoilàBonVoilàJe vais juste le couvrirVoilàOk. Alors, normalement, comme ça, ça devrait marcher
00:24:49 :Ok. NonAh! OuiAh! OuiQu'est-ce qui ne lui va pas?VoilàAlors, ok. Maintenant, je sais que...C'est bien ce que ça me faitVoilàOn y arrive. Désolé
00:25:49 :VoilàDonc, là, j'ai passémon argument ici, d'accordà mon décorateurLe wrapper, il m'a pris un paramètrequi est implicite avec le décorateur, la fonctionIl a envoyé tout dans une troisième fonction qui est à l'intérieurOkQui est capable d'utiliser tous les autres arguments qui sont au-dessus
00:26:15 :puisque, bien sûr, la non étant locale pour bonjourla fonction étant locale pour le wrapperOk. Mais comme la fonction inner est à l'intérieurdes deux autres fonctions, elle peut utiliser tous les arguments qui sont au-dessusElle a d'abord utiliséle paramètre non ici pour dire bonjourEt ensuite, elle a exécuté la fonction
00:26:36 :Donc, vous voyez que les décorateurs, c'est vraiment des fonctions à part entièreC'est pas juste un petit truc qui va vous rajouter quelque chose dans votre fonctionC'est vraiment une fonction à part entière et qui est capablede prendre en paramètre des fonctionset pour laquelle vous pouvez préciser d'autres paramètres
00:26:55 :Alors, l'histoire d'avoir des paramètres comme ça dans les fonctionsZoaré, tu vas le retrouver dans ton projet à venirPar exemple, dans Django, vous avez beaucoup de décorateursoù vous passez des fonctionsUn des plus courants qu'on utilise dans Django, c'est celui-làJe crois que je l'ai déjà vu celui-là
00:27:27 :VoilàMais n'importe quoiC'est pas correct, c'est pas graveLà, en fait, on passe un paramètre au décorateurEt en fait, les décorateurs, c'est vraiment des fonctions à partComme vous pouvez le voir làLà, on a vraiment une fonction telle qu'on l'a décritet on a imbriqué des fonctions à l'intérieur
00:27:48 :VoilàCe qui m'intéresse ce soir, c'est pas que vous compreniez exactementcomment on construit un décorateur, d'accord ?L'idée, c'est vraiment que vous compreniez ce qu'est un décorateurOk ?
00:28:05 :Si vous allez voir le cours de Thierry, il est beaucoup plus clair que moi sur le sujetparce que moi, je ne maîtrise pas ça non plus à 200%L'idée, c'était de vous montrer justement queun décorateur, c'est pas juste un terme magique qui sort de quelque partC'est vraiment une autre fonction qui définit
00:28:25 :d'ajouter d'autres actions, d'autres éléments à une première fonctionqu'elle va prendre en paramètrePour vous le montrer, je vais faire çaAlors, je ne sais pas siÇa doit marcherAlors, hop, je vais écrire ça vite fait pour queça me proposeHop làAlors, je casse la voiture et je prends ça
00:28:55 :HopC'est fini, vite faitOkJe ne sais pas si c'est ce que ça veut dire ou pasLeft test CLSDeux points, returnJour, n'importeJe ne peux pas vraiment l'exécuter, celle-làVoilàSi je vais sur mon classe méthodeet que je suis atteint de la définitionVous voyez
00:29:31 :J'ai une classe méthode avec des propriétésdes méthodes qui sont définiesOn est vraiment sur un autre objetOkEt juste au-dessus, on a la static méthodequi est définie, pareilVous voyez, c'est vraiment une fonctionqui va englober d'autres fonctionsEt vous voyez, on retrouve bien le terme de wrapper
00:29:53 :qui a apparaîtLe but, c'est vraiment derenvoyer, là par exempleVous avez Overload qui est un autre décorateurSi j'atteins la définitionHopÇa va un peu loin, il ne peut pas me le passerJust a secondOn va passer sur Propertyqui est souvent utilisé aussiVoilà
00:30:18 :On est bien encore sur une chosequi est définie comme une fonctionou une classe, parce que ça peut être aussi une classeun décorateurOkOn peut te poser une question sur lessur les décorateursspécifiquesTu peux me poser plein de questionsSi je peux y répondre, j'y réponds
00:30:40 :Si je peux y répondre, j'essaierai de trouver la réponseà minima pour la prochaine foisLà, tu regardais le OverloadC'est quoi la différenceavec le Override ?
00:30:52 :Override, je sais que c'est pourquand on a uneclasse, on peuthériter de cette classeet réécrireune fonction de la classeLe OverloadEcoute, je neJe vois pas de différenceOkAlors Overload, déjà de par le termeça serait une surchargeJe pense quela réponse que je vais te donner c'est une déduction logique
00:31:24 :Je pense quele Overrides'applique plusaux classes abstraitesqui ne sont pas censées être modifiéeset que l'Overload s'applique plusà toutes les autres classesJe vais me noter ça et je regarderai çapour essayer de t'apporter une réponse pluspréciseMoi, de prime abordc'est ce que j'en conclurai
00:31:54 :L'avantage, c'est un désavantagede Python, c'est que généralementils ne sont pascommentils n'ont pas été chercher des termes de l'espacepour expliquer les chosesDans la philosophie de Pythonl'idée c'est vraimentd'essayer d'être le plus clairMoi, de prime abord, ce que je te dirai, c'est ça
00:32:16 :Ok, ça marcheJe regarde vite fait, j'ai un truc làC'est sur la doc apparemmentqu'on peut changer le type deretourd'une fonctionOkAlors apparemment Overloadc'est pour une méthodedu même type de classequi partage le mêmetype de méthodemais qui ont des signatures différentes
00:33:04 :D'accordEt l'Override, luique ce soit une méthodeune implémentation spécifiqued'une méthodequi est déjà fournie dans laclasse parenteet qui est fournie à la classe enfantElle est utilisée pourmodifier le comportement de la méthode existanteD'accord, ouaisOkJe vois, merciVoilàN'hésitez pas, s'il y a d'autres questions
00:33:36 :il faut en profiterEst-ce que déjàje vous ai un petit peu éclairé surles décorateurs, est-ce que je vous ai pas embrouilléC'est déjà la première question que j'allais vous poseren faitPour moi, c'est clairTu peux, tu l'as dit, maistu peux rappeler le classe méthode
00:34:00 :Ca fait quoi déjà celui-là ?Le pardon ?Le classe méthodeLe classe méthode, ça va être utilisépour appeler des instances préconstituéesComment ?
00:34:14 :Comme je l'ai montré tout à l'heureavec la LamborghiniOn avait la marque, Lamborghinila vitesse et le prixSi par exempletu décides de faireun programme de gestion d'un garageAlors c'est un peuune manière pauvre de faire les choses maistu veux rentrer tous les types de voitures
00:34:38 :que t'as dans ton garageet qu'est-ce qu'on porte avec une classe de voitureavec un tas d'autres méthodesenvoyer à la réparationfaire une vidange, tout ce qu'on pourrait imaginerqui pourrait se passer dans un garageMais que t'as pas envie à chaque foisde redéfinir une nouvelleclasse, un nouvel objet
00:34:56 :pour ces voituresparce que tu vas mettonstraiter20 Lamborghini par jour20 Porscheet ainsi de suiteTu vas pouvoir créer cette instancedans ta classeet du couptu vas pouvoir la créer en utilisant la méthodede classe au lieu d'utiliserdirectementl'initialisateur de la classeJe vais essayer de te taper
00:35:24 :un petit exemple vite faitJe vais créer un autre fichierOui donc c'est une méthode de classeVoilàDonc c'est ma classe voitureOn est parti, voiture, plaqueOkOn hésiteOkVoilàÇa y est, on y arriveJe sais ce qu'il s'est passé ce coup-ciAutoshift, c'est pas terrible
00:44:30 :Ça a changé de langueVoilàNormalement on est bonVoilàVoilàEt donc du coup on ne garde en variableque ce qui va changer réellementEt on pourra les référencier les Lamborghinichaque annéeAh ouais okPascal reçoit la sienne demain, pour les autres vous attendrez un petit peu
00:45:34 :les livraisons c'est pas de suiteÇa va exploser en assuranceVoilàDoncVoilà l'intérêt par exemple d'utiliserla classe méthode oudans le cadre de la POEt tout ça c'est faisablegrâce aux décorateurs qui sont des fonctionsqui nous permettent de modifier le comportementd'une méthode ou d'une fonction
00:45:58 :de baseJe vous invite à aller voir comment construire les vôtresparce que vous verrez que la langue ça peut être très pratiqueparce que vous allez voir que très rapidement lorsque vous faitesdes programmes en python du scriptil y a beaucoup d'actions que vous répétezsur différentes fonctions
00:46:16 :vous en faites à votre décorateurpersonnalisé et du coup vous n'avez plusqu'à rajouter votre décorateur quand vous voulez obtenirle comportement vouluParce que finalement c'est une sous classe quand mêmeLa Lamborghini c'est une sous classede voiture quand mêmeC'est une mécanique classe méthodeça n'aurait pas marché
00:46:40 :C'est toujours la mêmec'est toujours un type voitureTiens je vais te montrerje vais faire çatypeLambo2Qu'est ce qu'il m'a fait encorec'est pas vrai ce soir je suis mauditVoilàUne petite parenthèseC'est toujours une classe voitureça n'a pas changéle type de l'objet
00:47:14 :Quelle est la différence si on avait faitla classe voitureet après derrière une classeLamborghini entre parenthèses voitureUne classe Lamborghiniqui aurait été de voitureOui voilàAlors premièrementça n'a pas un intérêt fondamentalparce qu'en fait l'héritage c'est bienmais il faut l'utiliser avec parcimoniepour vraiment que ça soit un intérêt
00:47:42 :L'héritage comme on l'expliquesouvent dans la PO c'est par exemplelorsque vous allez vouloir faire tout un tas de classesde type animauxvous allez créer une classe générale animaledans laquelle vous allez mettre les caractéristiques communesde vos animaux et puis après vous allez fairel'héritage pour éviter de répéter des attributs
00:47:58 :parce qu'ils sont communs à tous les animauxOk ?C'est pas le cas làLà on pourrait l'imagineren mettant qu'il y a 4 rouesqu'il y a un moteurLàle truc c'est pasde définir des typesd'attributs qui seraient communsLà on définit bien des valeursOn fait des instances d'objets
00:48:26 :En fait lorsque vous faites de l'héritagesi on avait fait une classecomme çaje vois ce que tu veux dire Pascalpar exemple si j'avais fait çaune classe Lamborghiniqui hérite de voitureVoilà c'est ça que tu veux direLà je récupèremes attributsmarque, vitesse, prix propriétaire
00:48:52 :dans ma classe LamborghiniOk ?Maispas les valeursC'est à dire que je crée un nouveau type d'objetOuais mais dansclasse Lamborghini voiture je peux pas diremarque égale Lamborghinivitesse égale 180prix égale 200 000Alors tu pourrais effectivementmais quelque parttu vas t'embêter à récrire
00:49:20 :toute une classe làOk ?Toute cette classe làparce qu'il va falloir que tu marquesTu vas créer ta classe làcomme çaOn va faire un passe tout bêtementparce qu'il fait rien de particulierEt derrière il va falloir que tu fassesLambo 3égaleLamborghiniClac
00:49:52 :LamborghiniVoilàPourquoi ? Parce que ça j'aurais pas pu le mettrelà où t'as écrit passeJe pouvais pas écrire Lamborghini180 et 200 000 là dedans ?
00:50:07 :Alors il faut faire unDes attributs de classeAlors à ce moment là il faut que tu repasses par làdéfiniteEt là tu redéfinis toute ta classeSauf que là tu vois rien queEt là on parle juste des caractéristiquesvite faitT'as déjà écrit presque autant de lignes
00:50:32 :que ta classe méthodeTu voisEt t'as créé un type d'objet différentOuais mais là il me suffit de mettreAprès l'utilisation ça revient au mêmeSi là je metsAh bah non parce que regardeLà du coupPour créer tata classe Lamborghini je suis obligé de repasser
00:50:57 :par la méthode où tu rentres les paramètresentre guillemets à la mainAh bon ? Même si je les ai mis comme attributsde classe, attributs de la sous classeTu veux les mettre comme ça ?
00:51:09 :Oui voilàexactement, est-ce que j'ai le droit de les mettre comme çalà ? Je mets Lamborghinipuis je mets vitesse égale 480etc. Ouais alors techniquement oui
00:51:19 :Regarde ce que ça faitJe vais te le faireEuhOn a dit vitesseégale181et euhprixégale 200 000Mais làt'as fait plus de lignes que le premier couppour commenceret ensuiteeuhsi tu créesLambo 3 LamborghiniOkNormalement si on fait un print
00:51:59 :deLambo 3 marqueça devrait marcher normalementsans soucisDonc là ça pose un problème déjàAh oui parce que ouiParce que tu peux pas, faut que tu réussissesavec son objet quand même, comme çaAh ouaisAh ouais non il fallait marquersuper.marque
00:52:23 :Avec le définitsuper ouiJ'avais commencé à faire tout à l'heureVoilàVoilàLà tu peux refaire ton trucAlors soit tu passestes arguments làéventuellement, mais c'est pas très propreLà il peut passerLà il peut passerque propriétaire maisdans le init que tu passes au super
00:52:51 :tu forces Lamborghinivitesse et prix comme on avait fait au dessusVoilà par exempleMais euhfranchement c'est pas des méthodes à utiliserEn fait c'est plusC'est plus intéressantSurtout que t'as une classe méthode qui te le faitEn fait grosso modosi t'asen terme d'héritageC'est utile quand tu vas avoir
00:53:15 :des méthodes qui vont être en communau plus haut niveauet un comportement quand même spécifiquedans ton enfantSinon ça va pas tout le monde faire une classeSi ça fait exactement la même choseça sert à rien de faire un héritageVoilà exactementTu as très bien résumé la problématique
00:53:33 :Ouais d'accordAh oui parce que là ça fait la même chosemais enfin oui d'accord mais c'est les attributsqu'on préciseVoilà en faitOui c'est juste les valeursC'est comme si t'avais copié ta classe en faitOuais donc pour ces comportementsil faut faire des sous-classes et si c'est les valeurs
00:53:55 :on fait desVoilà si t'as une méthode spécifiqueà ta Lamborghini parce qu'elle faitqu'un truc que ne font que les Lamborghinipourquoi pasmais sinon ça a pas d'intérêtLà ce que tu peux rajouter par rapport à la voiturec'est que la Lamborghini elle ouvre la portièrevers le haut
00:54:13 :Et ce serait quelque chose queaucune autre voiture n'asauf LamborghiniVoilà et par exemple ça pourrait justifierà ce moment là de faire un héritageOui voilàIl y a la DeLorean aussiVoilàSi c'est pour pas rajouterune fonctionnalité préciseau type d'objetFaire un héritage de classe
00:54:39 :c'est pas intéressantD'accordOuais donc héritagepour méthodeet méthode de classepour les valeurs, les attributsVoilàJe suis d'accordSurtout que là on a que 4 attributsmais il y a des foist'as des classesje vais essayer d'ouvrir çaVoilàIciIciVoilàLà t'as un petit peu plus de choses
00:55:21 :à la limiteDonc t'imagines si tu doiscommencer à refaire tout çaDonc ce qu'il te fait c'est faireta classe méthodeEt à chaque fois que tu vas recréer tes objetsTu vas devoir reparamétrerpas mal de ces paramètresde ces paramètres là qui sont déjà dedansTu vois
00:55:46 :Ah bon dans une sous-classe on est obligé de remettretout ce qu'il y a dans la classe ?Tu vas récupérer le définite supermais à la créationOui voilàSi t'as autant d'attributs que ça tu vas devoirrecréer à chaque fois les attributsTu voisA chaque fois que tu crées un objet
00:56:04 :que là tu le fais ici une bonne fois pour touteet t'es plus embêté avec ça quoiTu peux laisser un attribut comme j'ai fait làavec propriétaireet là t'as un gain de tempsdans ta création d'objetParce qu'à chaque fois la seule chose que t'as besoin de repréciser
00:56:20 :pour créer une Lamborghini c'est le propriétaireEt c'est là que rentreLe principe d'un décorateurJe vais vous le montrer celui-làOn va supprimer çaAlors qu'il est à manieravec précaution parce que si on en prend tropl'habitude après on s'est pu faire des classes classiquesComme ça
00:56:48 :Et data classC'est n'importeC'est from dataclassesimportdata classEt làsi je le mets en data classje peux mettremarqueégaleLamborghiniVoilàvitesseégale180prix200 000Et là dans le contexte d'une data classtu peux le faire comme çaOkParce que les data class c'est vraiment des objets que tu vas créer
00:57:46 :Alors ceux-là je les ai mis en durmais tu peux mettre des variablesLes deux sont possibles avec la data classEt là c'est le décorateurqui crée un comportement sur ta classequi te permet de créer des arguments directement comme çaAlors les data classil faut déconseiller les utiliser
00:58:05 :avant de vraiment êtreau top sur la programmationet sur les objetsParce que c'esttrès facile au début pour créer les classeson crée ses arguments beaucoup plus simplementon n'a pas besoin de s'embêter de faire le définitde faire les self, marque égale marquequi peut paraître rébarbatif au début
00:58:24 :mais si vous ne maîtrisez pasvotre initialisation de classeet que vous basculez sur les data classavant d'avoir maîtrisé çaquand vous allez devoir revenir àla création de classe basiquevous allez galérer un petit peuDonc le data classje vous déconseille de l'utilisertant que vous n'êtes pas vraiment
00:58:46 :opé sur la programmationOkIl y a des questions Tosa sur les data class ?Je n'ai pas souvenir d'en avoir vuOkVoilà, voilà, voilàEst-ce qu'il y a d'autres questions sur tout ça ?
00:59:11 :Sur d'autres questions rapides ?Sur autre chose ?Allo StéphaneIl y a des questions sur le décorateur ?OuaisEst-ce que tu peux révéler sur notre rappeur là ?
00:59:24 :Pardon ?Est-ce que tu peux révéler sur le rappeur qu'on a appelé là ?OuiIciIci, voilà, ouiVoilàLà si on décoreBonjourIl exécuteBonjouret la fonctionavant d'exécuterIl va d'abord afficher le prix de bonjourOuiAprès la fonctionExactementLà c'est souvent si tu as des choses à faire
01:00:05 :avant la fonction par exempleJe peux faire après aussiExactement, je parle aprèsEst-ce que ou bien on metOkVoilàVoilàEt là si j'exécuteIl dit çaÇa va s'exécuter dans l'ordreDonc là okDonc si on a des trucson les met après la fonctionVoilà
01:00:49 :T'es pas obligé d'avoir quelque chose avantJe vais supprimer le bonjour iciJe vais le mettre plutôt en dessousparce que sinonje risque de m'embêter avec le fait que j'y passe un argumentqui ne s'utilise pasIl m'a bien remis le bonjouraprès avoir exécuté la fonctionJe comprends
01:01:11 :Est-ce que tu aurais un exempled'utilisation de décorateurqui devraits'exécuter à la finA la fin de la fonction, après la fonctionOuiTout simplement si tu mets làc'est ce que je viens de faire làD'abord il exécute la fonctionet après il exécute les surplus du décorateur
01:01:35 :YesUn exemple par exemplelà le logging requiredsur Djangoc'est on regarde sil'utilisateur est loguépuis on faitla suite. Mais làqu'est-ce qu'on pourrait faireà quoi ça pourraitnous servir de l'avoir à la finEst-ce que t'as des exemplesQue le décorateur exécuteles données à la fin
01:02:03 :après la fonctionBah voilà, je vais t'en montrerun très rapidementparce que j'en ai jamais vuen supprimant le innerOn va revenir surle standardVoilàTacJe supprimeces trois lignes làPas typiquement pour dire au revoir si on se log outOui maisje vais te montrer un truc
01:02:31 :même encore un peu plus intéressantça va pas vraiment aller dans tous les sensVoilàJe sais pas pourquoi j'ai marqué un égal làPeu importeJe vais lire ça parce que sinon il va me direque je passe un paramètre qui n'existe pasVoilàVoilàQu'est-ce que j'ai fait comme bêtise
01:03:28 :T'as enlevé le titre de bonjourHein ? Ah oui nonHumTac tac tacHum hum humPour le coup je vois où tu veux en venirOuaisBonL'heure est un peu tardiveJ'ai plus tous les trucs en têteMais en fait techniquement tu peux même renvoyerle résultat de ta fonction dans une variable
01:03:59 :OkBonTu peux vraiment faire tout ce que tu veuxavec tes décorateursTu peux utiliser la fonctionpour récupérer une valeurTu peux envoyer l'info à la finTu peux l'envoyer avant, au début, pendantEnfin tu peux vraimentfaire tout ce que tu veux quoiOkJe te vois, merci
01:04:23 :Par exempleTiens je vais le faire comme çaça sera un peu mieuxHop on va faire comme ça pour avoirassimilé ce que je voulais faireTacOkVoilàC'est assezHopJe vais le mettre en paramètrecomme ça parce que siAttends on va voir si ça passe ou pas
01:04:57 :Comme çaJe vais faire comme çaparce que je ne veux pas m'embêter avec mes crochetsqui ne marchent pas ce soirEst-ce que normalementça devrait passer ?
01:05:12 :VoilàNonEt ça a fait Bonjour StéphaneIl y a le Bonjour StéphaneOui parce que à mon avis c'est dans monJe vais faire un return qui ne va pas bienMais voilàC'est la fonction question à la finoù il n'y a pas de nomOuais je pense que c'est pour ça
01:05:37 :En fait l'idée c'est queje vais vraiment rentrer l'inputiciet je vais passer à la fonctionqui l'a repassé ici pour l'écrire làTu voisTu peux vraiment avoir une interaction complèteavec le décorateurTu peux soit envoyer des variablesdepuis ta fonction vers le décorateurou depuis le décorateur vers la fonction
01:06:03 :OkPour le plus de détailspour faire vos décorateurs personnalisésallez voir le live de Thierryil est dix fois mieux fait que ce que je vous présente ce soiret lui il connait vraiment le sujet sur le goût des noixça a duré une heure et demie pour faire son live
01:06:19 :et enfinc'est vraiment hyper completJ'ai pensé à un autre casc'esttu aurais peut-être parlé tout à l'heurej'ai dû m'absenterc'est que tu te faisun décorateur pourmesurer la performance d'une fonctiondonc tu prendsla start time juste avant de l'exécutertu la récupères juste après
01:06:43 :et du coup après tu printsce qu'on a fait tout à l'heuredonc ça c'est un autre casdu coup tu fais aussi un trucaprès avoir appelé ta fonctionVoilàEn fait les décorateursil y a les décorateurs existantsdonc n'hésitez pas à vous documenter dessuset à vous renseigner comment ils fonctionnent
01:07:03 :pour les utiliser dans vos programmesou vos scriptset vous pouvez faire des décorateurs personnaliséspour des actions qui se répètentrégulièrementau cours de vos programmes ou de vos scriptset comme çaça vous permet au lieu de remettre à chaque foisdonc l'exemple que tu parlaisDoiret qu'on a fait aussi tout à l'heure
01:07:23 :de mesurer le temps d'une fonctionc'est l'exemple vraiment typiquerégulièrement quand on commenceà essayer d'optimiser son programmeon va mesurer le temps que fait chaque fonctiondonc on va mettre un start time dans la fonctionun print machinalorsvous pouvez le faireon pourrait par exemple imaginer
01:07:43 :que vous passezque vous prenezles arguments de la fonctioncertains arguments de la fonction et que vous les imprimezpour voir à quoi elles correspondentquand ils passent dans telle ou telle fonctionStéphane, au faitaussi est-ce quesi j'ai fait une API par exemplepour le type de
01:08:11 :validationdes requirementsje peux utiliser un décorateurje vais vérifier le nombreà telle lengthil a tel nombrede spécificationsvérifier siles arguments sont bien les bonsoui tu peuxc'est exactement ce que faitlogin requireddans Djangoil va vérifier d'abord sil'utilisateur est bienconnecté
01:08:43 :ok, si c'est le casil laisse s'afficher la vueokje vais peut-être vous montrerun petit exemple pratique de çail va falloir que je basculesurl'exemplepour tout ça je vais vous montrer çavite faitnormalementvoilàclacje vais basculer pour vousmettrebasculer sur type charme
01:09:33 :voilàalorslà vous voyez ici j'ai un login requiredokj'ai un login requireddonc là avec çail va vérifier d'abord si l'utilisateur est connectés'il est connectéil va afficher la vue profilok, par contres'il n'est pas connecté, il renvoiesur l'URLde connexiond'accordje vais vous montrer un autre
01:10:15 :que j'ai préparé pour plus tarduserpassistestokdonc là il va vérifier avec une petite fonction lambdasi l'utilisateurest de type NTECHd'accordsi c'est le casdu coup il permet d'accéderà la fonction, sinonil renvoieà la racine du projetvous voyez on peut vraiment faire beaucoup beaucoup
01:10:45 :de choses avec les décorateurs finalementvous pouvez vraiment modifier le comportementde vos fonctions et dire tiens moi je veux vérifier ça en plusje veux vérifier ça en plus ou je veux ajouter çaet làje vais commenteron peut avoir2, 3, 4, 5, 6,10 décorateurs qui sont sur une fonction
01:11:09 :et ils vont s'exécuter dans l'ordreil va d'abord faire le rugby recueilleuraprès il va vérifier le passistestest-ce que tu peuxfaire uncommande cliqueou alt clique sur le loginrequireds'il te plaittu veux voir la définitionj'ai une question surle funkutilsje ne sais pas si ça
01:11:47 :funk toolsje ne sais pas si tu as déjà vu çaà quoi ça sertil y a beaucoup de chosesqui sont intéressantesavec le partiel notammentle cacheon avait joué pas malavec le funk tool quand on avait jouéavec la mémoireje ne sais pas si vous vous souvenez
01:12:15 :le NRU cachele funk toolil propose des décorateursparce que le NRU cache c'est un décorateurje vais essayer de vous simplifier un peul'idée des décorateurs pour que ce soit encore plus clairdans vos espritsest-ce que vous avez faitou regardéau moins une fois du langage C
01:12:43 :ça ressemble au C++ouic'est des basesdans le langage C on parle beaucoup de pointeurd'accordqui renvoie vers des valeursdes fonctions et ainsi de suitele at c'est un pointeur en faitd'accordat c'est versc'est à cet endroit làdonc en fait c'est pour ça que les décorateurs sont écrits comme ça
Aucune occurrence trouvée pour « ».