Dus laten we het hebben over enkele van de praktische toepassingen van decorateurs, ik bedoel, we hebben ze al in de
lessen gezien, toch?
We hebben gezien hoe de klassenmethode en de statische methode klassenmethoden en statische methoden konden maken voor de klasse die
de directe klasse kan gebruiken.
En als je deze niet meer weet, ga dan gewoon terug naar die video's.
Maar ik wil je een van mijn favoriete voorbeelden van een decorateur laten zien, we gaan er zelf een maken.
Wat we gaan doen, is dat ik een optreden wil.
Decorateur en trouwens, deze decorateur bestaat niet in Python, we gaan hem helemaal opnieuw bouwen.
Wat ik wil doen, is een prestatiedecorateur hebben die ik kan gebruiken tijdens het testen van mijn code om te zien hoe
snel mijn code wordt uitgevoerd.
Als ik bijvoorbeeld een functie had, laten we zeggen dat dat lang duurt.
Nou, een lange tijd om te voltooien, dus ik ga een heel lange lus doen en zeg voor ik binnen het bereik van laten we
zeggen.
Al deze getallen, en ik ga gewoon een willekeurige berekening doen, ik maal vijf.
Deze functie, ik wil weten hoe goed hij presteert, hoeveel milliseconden het kost om dit te voltooien, dus hoe kunnen
we dat bouwen?
Ten eerste ga ik iets doen waar we het nog niet over hebben gehad, dat we
iets gaan doen over modules in ingebouwde modules, dus voorlopig gaan we hier niet te veel
over praten, maar we gaan om uit de tijdmodule iets te importeren dat dubbele tijd wordt genoemd.
Nogmaals, iets waar we het over zullen hebben in het modulegedeelte van de cursus, ik zeg in
wezen, hey, toen ik Python installeerde of in mijn geval wanneer ik deze Reppel gebruik, heeft het toegang tot deze tijd als ik
het vraag ervoor.
En in dit geval zeg ik, hey, ik wil dit tijdobject of deze module gebruiken die ik van Python krijg.
En hier gaan we onze decorateur maken volgens het patroon dat we hebben geleerd.
Ik ga zeggen dat definieer prestaties en prestaties gaan een functie accepteren zoals we eerder hebben gezien.
En hier hebben we onze wikkel.
Dus laten we zeggen wrapper-functie en wrapper-functie.
Als je het je herinnert, zal het flexibel zijn door sterbogen en sterstersleutelwoordbogen op te nemen.
Zodat we het zoveel parameters kunnen doorgeven als we willen, omdat we niet weten hoe deze functie, hoeveel parameters
het zal hebben, en ik wil prestaties kunnen gebruiken voor al mijn functies.
Nu, hier eerst, wat we gaan doen, is dat we het resultaat van de functie krijgen.
Wees de.
Functie die we hier ontvangen en dan gewoon zeggen.
Voer de functie uit met ster- en sterster-zoekwoordbogen.
En tot slot, aan het einde hiervan, wil ik de resultaten teruggeven.
En dan tot slot, we gaan de rapper terugbrengen, dus niets dat we nog niet eerder hebben gezien, ik had gewoon hier kunnen terugkeren of
de functie kunnen uitvoeren, maar ik zal je in een oogwenk laten zien waarom ik het op deze manier deed .
Op dit moment doet onze functie eigenlijk niets.
Als ik klik, ren dan weg.
Welnu, er gebeurt niets als ik dit lang doe en deze functie uitvoer.
Het duurde gewoon lang om te rennen, maar dat is alles, er gebeurt niets.
Dit is wanneer we dingen interessant maken.
We willen berekenen vanaf het begin van het uitvoeren van deze functie tot het einde van het uitvoeren van deze functie.
En we kunnen de tijdmodule gebruiken om dit te doen.
Ik kan voor het begin een variabele tijdlijn maken en gewoon tijd zeggen.
Dus ik gebruik deze tijdfunctie die gaat starten.
Een tijd en zeg, hé, deze eerste keer wordt er een.
En na deze functie, onze hoofdfunctie, wordt een lange tijd gelopen, ga ik T twee zeggen en zeggen, hoe
laat is het?
Nu.
Dus deze keer zullen we kijken hoe laat het is en dan gaan we deze functie uitvoeren en deze keer gaat
het de tijd controleren en hoeveel verschil er ook is tussen deze twee, is hoe lang dit
deel duurde.
Rechts.
Dus we hoeven alleen maar een F-tekenreeks af te drukken en te zeggen dat T één minus T kostte.
Juist, en dit geeft eigenlijk een milliseconde terug, dus ik zeg gewoon armen vier milliseconden.
En dat is het.
Ik heb mijn functie ingepakt met alleen dit extra uurwerk, en dan print ik, zodra we de functie hebben uitgevoerd,
hoe lang het duurde.
Dus laten we het eens bekijken.
Als ik nu mijn oude functie hier uitvoer en ik klik op uitvoeren.
Oké, ik krijg een min-getal omdat ik het hier verprutst heb.
Dit zou T twee min T één moeten zijn, omdat de tijd op T eerst wat tijd verstrijkt en dan twee.
Dus twee zullen altijd groter zijn dan T één als ik dit uitvoer.
Oké, het kostte punt één, zes milliseconden, ik denk dat dit eigenlijk seconden zijn.
Laten we deze lange functie nog langer maken als ik zo ga en op uitvoeren klik.
Oh, jongen, dat duurde één komma negen seconden.
Wat als ik het nog langer maak, als ik op uitvoeren klik en dit is het deel waar ik blijf praten totdat de functie
loopt, omdat er een ongemakkelijke stilte zal zijn, anders eindigt dit hopelijk snel omdat ik niets anders
heb om over te praten.
Kom op, dit wordt ongemakkelijk.
Oke.
Kom op.
O, jongen.
Ik ga hier snel doorspoelen.
Oh, jongen, het duurde 19 seconden.
Dat is best erg.
Maar ik heb nu deze decorateur die ik aan vrijwel elke functie in mijn programma kan geven en die de prestaties van mijn
functie eigenlijk best nuttig kan meten, toch?
Ik zou dit stukje code kunnen hebben.
En voordat laten we zeggen dat ik mijn code implementeer of mijn code de wereld instuur, kan ik testen hoe performant mijn functies
zijn en misschien kan ik dingen op verschillende manieren optimaliseren.
Heel, heel handig.
En dat deed ik in slechts een paar regels code.
Negen regels code.
Let wel, deze prestatiedecorateur hangt af van de machine en hoe snel uw CPU en geheugen op uw
computer zijn.
Dus voor wat mij 19 seconden kostte, kan het je veel meer of veel minder kosten, afhankelijk van je machine.
Maar dit is een leuke manier om functies relatief te vergelijken.
Dus ik hoop dat je hierna ziet dat de kracht van decorateurs en decorateurs veel worden gebruikt in Python-bibliotheken
en frameworks.
Webframeworks waar we het over gaan hebben, zoals Django en Flask gebruiken decorateurs,
misschien wil je een authenticatie-decorateur hebben, zodat je authenticeert waarbij elke functie alleen kan worden uitgevoerd.
Als de gebruiker is geverifieerd.
Misschien hebben ze het voorrecht om een functie uit te voeren, zoals inloggen op een website.
Of misschien heb je gewoon een logging of logging nodig.
Decorateur die gewoon logt en uw database laat weten dat, hey, iemand heeft ingelogd op uw systeem of,
hey, iemand heeft iets gekocht bij Amazon.
Of, hey, iemand heeft zojuist een vriendschapsverzoek aangevraagd, er zijn zoveel toepassingen voor decorateurs en decorateur is een
moeilijk onderwerp.
Je zult ze niet overal in de Python-code zien.
Ze zijn slechts een extra functie die je kunt gebruiken naarmate je meer en meer vertrouwd raakt met Python.
Maar ik hoop dat je aan het einde van deze hal ze het minst begrijpt om misschien ooit je
eigen te bouwen of kant-en-klare bibliotheken en frameworks te gebruiken.
Ik zie je in de volgende.
Doei.