Şimdi dekoratörlerin bazı pratik uygulamalarından bahsedelim.
Yani, onları zaten sınıflarda gördük, değil mi?
Sınıf metodu ve statik metodun nasıl olduğunu gördük, sınıf üzerinde doğrudan sınıfın kullanabileceği sınıf metotları ve
statik metotlar oluşturabiliyoruz.
Ve eğer bunları hatırlamıyorsanız, o videolara geri dönün.
Ama size en sevdiğim dekoratör örneklerinden birini göstermek istiyorum.
Kendimizinkini yaratacağız.
Yapacağımız şey, bir performans sergilemek istiyorum.
Dekoratör.
Ve bu arada, bu dekoratör Python'da mevcut değildir.
Sıfırdan inşa edeceğiz.
Yapmak istediğim şey, kodumun ne kadar hızlı çalıştığını görmek için kodumu test ederken kullanabileceğim bir performans
dekoratörüne sahip olabilmek.
Örneğin, bir fonksiyonum olsaydı, diyelim ki uzun zaman alıyor.
Tamamlamak için uzun bir süre.
Bu yüzden gerçekten uzun bir döngü yapacağım ve I için diyelim ki aralığında diyeceğim.
Tüm bu sayılar ve ben rastgele bir hesaplama yapacağım, beşle çarpacağım.
Bu fonksiyon.
Ne kadar iyi performans gösterdiğini, bunu tamamlamanın kaç milisaniye sürdüğünü bilmek istiyorum.
Peki bu kemeri nasıl bağlayabiliriz?
İlk olarak henüz bahsetmediğimiz bir şey yapacağım, modüller ve yerleşik modüller hakkında bir
şeyler yapacağız.
Şimdilik bunun hakkında çok fazla konuşmayacağız, ancak zaman modülünden kuyu zamanı
adı verilen bir şeyi içe aktaracağız.
Yine, kursun modül bölümünde bahsedeceğimiz bir konu.
Aslında diyorum ki, hey, Python'u yüklediğimde ya da benim durumumda bu dalgalanmayı kullandığımda,
eğer istersem bu zamana erişebilir.
Ve bu durumda, diyorum ki, hey, Python'dan aldığım bu zaman nesnesini veya modülünü kullanmak istiyorum.
Ve burada, öğrendiğimiz kalıbı izleyerek dekoratörümüzü oluşturacağız.
Performansı tanımla diyeceğim.
Ve performans, daha önce gördüğümüz gibi bir işlevi kabul edecektir.
Burada da paketleyicimiz olacak.
Diyelim ki sarmalayıcı işlev ve sarmalayıcı işlev.
Hatırlarsanız, yıldız yaylarını ve yıldız yıldız anahtar kelime yaylarını alarak esnek olacak.
Böylece istediğimiz kadar parametre geçirebiliriz, çünkü bu fonksiyonun nasıl olacağını, kaç parametreye sahip
olacağını bilmiyoruz.
Ve tüm işlevlerimde performansı kullanabilmek istiyorum.
Şimdi burada ilk olarak yapacağımız şey, fonksiyonun sonucunu almak olacak.
Ol.
Burada aldığımız işlevi yerine getirin ve sonra sadece şunu söyleyin.
Fonksiyonu star args ve star star anahtar kelime yayları ile çalıştırın.
Ve son olarak, bunun sonunda, sonuçları döndürmek istiyorum.
Ve son olarak rapçiyi geri getireceğiz.
Yani daha önce görmediğimiz bir şey değil.
Burada sadece return yapabilirdim ya da sadece fonksiyonu çalıştırabilirdim, ancak neden bu şekilde yaptığımı birazdan
göstereceğim.
Şu anda, işlevimiz gerçekten hiçbir şey yapmıyor.
Çalıştır'a tıklarsam.
Bu işlevi uzun süre çalıştırırsam hiçbir şey olmuyor.
Sadece çalışması uzun sürdü.
Ama hepsi bu.
Hiçbir şey olmuyor.
Bu, işleri ilginç hale getirdiğimiz zamandır.
Bu fonksiyonu çalıştırmanın başından sonuna kadar olan süreyi hesaplamak istiyoruz ve bunu yapmak
için zaman modülünü kullanabiliriz.
Başlangıç için değişken bir zaman oluşturabilirim ve sadece zaman diyebilirim.
Bu yüzden başlayacak olan bu zaman fonksiyonunu çalıştırıyorum.
Bir zaman belirleyin ve deyin ki, hey, bu ilk zaman PT bir olacak.
Ve bu fonksiyondan sonra ana fonksiyonumuz longtime çalıştırılır.
İki diyeceğim ve "Hey, saat kaç?" diyeceğim.
Şu anda.
Bu sefer saatin kaç olduğunu kontrol edeceğiz.
Sonra bu fonksiyonu çalıştıracağız ve bu sefer saati kontrol edecek.
Ve bu ikisi arasında ne kadar fark varsa, bu bölüm o kadar uzun sürdü.
Doğru.
Yani tek yapmamız gereken bir F dizesi yazdırmak ve bunun T bir eksi t iki aldığını söylemek.
Doğru.
Ve bu aslında milisaniye cinsinden geri döner.
O yüzden bir saniyeliğine GM'ler diyeceğim.
İşte bu kadar.
Fonksiyonumu sadece bu ekstra zaman parçasıyla sardım ve sonra fonksiyonu çalıştırır çalıştırmaz ne kadar sürdüğünü
yazdırıyorum.
Hadi bir bakalım.
Şimdi burada uzun süreli işlevimi çalıştırırsam ve Çalıştır'a tıklarsam.
Pekala, burada hata yaptığım için eksi bir sayı alıyorum.
Bu, t iki eksi rt bir olmalıdır çünkü RT bir üzerindeki zaman bir süre geçer ve sonra TT iki olur.
Dolayısıyla TT 2 her zaman TW 1'den daha büyük olacaktır.
Eğer bunu çalıştırırsam.
Tamam.
0 aldı. 16 milisaniye.
Sanırım bu aslında saniye.
Şimdi bu şekilde gidip Çalıştır'a tıklarsam bu uzun işlevi daha da uzun hale getirelim.
Aman Tanrım.
1 saat sürdü. 9 saniye.
Çalıştır'a tıklarsam daha da uzarsa ne olur?
Ve bu, fonksiyon çalışana kadar konuşmaya devam ettiğim kısım, çünkü garip bir sessizlik olacak.
Aksi takdirde, umarım bu yakında biter çünkü konuşacak başka bir şeyim yok.
Hadi ama.
Bu iş garipleşmeye başladı.
Pekala, hadi.
Aman Tanrım.
Hmm.
Buradan hızlıca geçeceğim.
Aman Tanrım.
19 saniye sürdü.
İşte bu.
Bu oldukça kötü.
Ancak artık programımdaki hemen hemen her fonksiyona verebileceğim ve fonksiyonumun performansını gerçekten ölçebileceğim
bu dekoratöre sahibim.
Oldukça kullanışlı, değil mi?
Bu kod parçasına sahip olabilirim ve diyelim ki kodumu dağıtmadan veya kodumu dünyaya sunmadan önce.
Fonksiyonlarımın ne kadar performanslı olduğunu test edebilirim ve belki de işleri farklı şekillerde optimize edebilirim.
Çok, çok faydalı.
Ve bunu sadece birkaç satır kodla yaptım.
Dokuz satır kod.
Şimdi, bu performans dekoratörünün makineye ve bilgisayarınızdaki CPU ve belleğin ne kadar hızlı olduğuna bağlı olduğunu
unutmayın.
Yani benim 19 saniyemi alan şey, makinenize bağlı olarak sizin çok daha fazla veya çok daha az zamanınızı alabilir.
Ancak bu, fonksiyonları göreceli olarak karşılaştırmak için güzel bir yoldur, umarım bundan sonra dekoratörlerin gücünü görürsünüz.
Dekoratörler Python kütüphanelerinde ve çerçevelerinde çok kullanılır.
Django ve Flask gibi bahsedeceğimiz çerçeveler dekoratörler kullanmaktadır.
Belki bazı kimlik doğrulama dekoratörlerine sahip olmak istersiniz, böylece her işlevin yalnızca kullanıcının kimliği
doğrulanmışsa çalıştırılabileceği bir kimlik doğrulaması yaparsınız, belki de öyledir.
Bir web sitesine giriş yapmak gibi bir işlevi çalıştırma ayrıcalığına sahiptirler.
Ya da belki sadece bir giriş veya oturum açmaya ihtiyacınız vardır.
Veritabanınızı günlüğe kaydeden ve hey, birisi sisteminize giriş yaptı veya Hey, birisi Amazon'dan bir
şey satın aldı diye bildiren dekoratör.
Ya da Hey, az önce biri arkadaşlık isteği gönderdi.
Dekoratörler için çok fazla kullanım alanı var ve dekoratör zor bir konu.
Bunları python kodunun her yerinde göremezsiniz.
Bunlar sadece Python ile daha fazla ve daha rahat hale geldikçe kullanabileceğiniz ekstra bir özelliktir.
Ancak tüm bunların sonunda, belki bir gün kendinizinkini oluşturmak veya kütüphaneler ve çerçeveler tarafından önceden oluşturulmuş olanları
kullanmak için bunları en azından anlayacağınızı umuyorum.
Bir sonrakinde görüşürüz.
Güle güle.