Tanım: Dekoratör, Python'da bir tasarım kalıbıdır. Başka bir işlevi argüman olarak alan, değiştirmeden ona bazı işlevler ekleyen ve başka bir işlev döndüren bir işlevdir.
Buna “(@)” kullanılarak denir ve süslemek istediğimiz bir fonksiyon tanımlamadan önce yerleştirilir.
sözdizimi:
@dekoratör adı
fonksiyon tanımı
Dekoratörleri anlamak için aşağıdaki kavramları bilmemiz gerekir.
Fonksiyonlar birinci sınıf nesnelerdir. Bir fonksiyonun argüman olarak geçirilebileceği, başka bir fonksiyondan döndürülebileceği, bir değişkene atanabileceği, başka bir fonksiyonda tanımlanabileceği anlamına gelir. Daha iyi bir anlayış için aşağıdaki örneklere bakın.
- Bir işlev argüman olarak iletilebilir
Örn: def artış(n):
dönüş n + 1
def demo_funcall (işlev):
sayı = 5
dönüş işlevi(sayı)
demo_funcall (artış)Burada artırma işlevi argüman olarak iletildi
örnek 1.not:
Çıktı:
>> piton örneği1.p
- İşlev başka bir işlevden döndürülebilir
Örn: kesinlikle dilek():
def say_wish():
"Doğum günün kutlu olsun" geri dön
say_wish'i iade et
merhaba = dilek()
Merhaba()örnek2.not:
Çıktı:
>> piton örneği2.p
Burada dilek işlevinden dönen say_wish işlevi - Fonksiyon değiştirilebilir ve bir değişkene atanabilir
Örn: tanım ekle(a,b):
a + b'yi döndür
sum2nos = ekle # Burada değişkene atanan fonksiyon ekle
toplam2nos(5,11)örnek3.not:
Çıktı:
>> piton örneği3.p
- Fonksiyonu başka bir fonksiyon içinde tanımlayın
Örn: tanım ekle(a,b):
tanım toplamı2(a,b):
a + b döndür
res = toplam2(a,b)
dönüş res
ekle(10,15)örnek4.not:
Çıktı:
>> piton örneği4.p
Kapanış:
Python, iç içe geçmiş bir işlevin, çevreleyen işlevin dış kapsamına erişmesine izin verir.
def selamlama(mesaj):"Ekleme İşlevi"
def send_greeting():
"İç içe işlev"
yazdır(mesaj)
tebrik göndermek()
selam ("Günaydın")
örnek5.not:
Çıktı:
>> piton örneği5.p
Şimdi yukarıdaki kavramları anladıktan sonra bir dekoratör örneği yazacağız.
Ör1: Burada mesaj fonksiyonunu süsleyeceğiz. Orijinal işlevi değiştirmeden **** içindeki mesajı yazdırma, i.e., mesaj fonksiyonu.
#dekoratör başlangıcıdef print_msg(işlev):
def sarmalayıcı():
işlev()
iade paketi
#dekoratör sonu
tanım mesajı():
print(“Bu, dekoratörü göstermek için ilk örnek”)
merhaba = print_msg(mesaj)
Merhaba()
örnek6.not:
Çıktı:
>> piton örneği6.p
En basit haliyle, işlev tanımının üstüne dekoratör yerleştirebilir ve aşağıda gösterildiği gibi işlevi çağırabiliriz:
Burada *** içinde süslemek istediğimiz ip ne olursa olsun, bu dekoratörü kullanın.
Çıktı:
Çoklu dekoratör:
Tek bir işlev için birden fazla dekoratörümüz olabilir. Burada dekoratör dediğimiz sırayla uygulanır.
sözdizimi:
@decorator2
@decorator1
fonksiyon tanımı
Burada 1. dekoratör uygulanacaktır, ardından 2. dekoratör.
Argümanları dekoratör işlevlerine iletmek:
Sarmalayıcı işlevine argümanları iletebiliriz. Süslemek istediğimiz fonksiyona iletilen argümanlar.
Örn:
def deco_wish(işlev):def sarmalayıcı (arg1, arg2):
print ('geçen argümanlar ',arg1, arg2'dir)
Yazdır ('*********************')
fonksiyon (arg1, arg2)
Yazdır ('*********************')
iade paketi
@deco_wish
def dilek(a1, a2):
yazdır(a1,a2)
dilek ('İyi', 'Günaydın')
dilek ('İyi', 'Öğleden Sonra')
örnek7.not:
Çıktı:
>> piton örneği7.p
Dekoratör işlevine değişken sayıda argüman iletin:
*args (sayılar gibi anahtar sözcük olmayan bağımsız değişkenler) ve **kwargs (sözlük gibi anahtar sözcük bağımsız değişkenleri) kullanarak herhangi bir sayıda bağımsız değişken iletebiliriz. Her ikisi de konumsal argümanlardır ve argümanları args ve kwargs değişkenlerinde saklar.
Not: Burada args ve kwargs yerine herhangi bir isim kullanabiliriz ancak bu isimlerin kullanılması tavsiye edilir.
Örn:
def dec_var_args(işlev):def sarmalayıcı(*args, **kwargs):
print('Anahtar kelime olmayan argümanlar', argümanlar)
print('Anahtar kelime argümanları', kwargs)
işlev(*args)
iade paketi
@ dec_var_args
def fun_non_key_args(*args):
args içinde ben için:
yazdır(i)
@ dec_var_args
def fun_key_args():
print(“Anahtar kelime argümanları”)
fun_non_key_args((4,5,6))
fun_key_args(fname='Anand', lname='Matematik')
örnek8.not:
Çıktı:
>> piton örneği8.p
Ör2: Diyelim ki 2 fonksiyonumuz var
Function1: Verilen listedeki sayıların toplamını hesaplayın
Function2: Her sayıyı 2 ile çarpın ve verilen sayı listesine ekleyin
Her birinin yürütme için geçen süreyi hesaplamak istiyorsak, bunu 2 şekilde yapabiliriz
- Kodu her işlevde başlangıç ve bitiş zamanı arasına yerleştirin
- Zamanı hesaplamak için dekoratör yaz
Dekoratör kullanılarak çözülen aşağıdaki koda bakın:
#dekoratör başlangıcıexe_time_calc(işlev):
def sarmalayıcı(arg):
start_time = tarihsaat.tarih saat.şimdi()
işlev(arg)
end_time = tarihsaat.tarih saat.şimdi()
print ("Fonksiyonun yürütülmesi için geçen süre" + func.__name__ + " is " + str(bitiş_zamanı - bitiş_zamanı))
iade paketi
#dekoratör sonu
@exe_time_calc
def cal_avg(veri):
toplam = 0
verilerde i için:
toplam += ben
print ("Verilen sayı listesinin ortalaması ", sum//len(veri))
@exe_time_calc
tanım mul_by_2(veri):
toplam = 0
verilerde i için:
toplam += + (i*2)
print ("2 ile çarpıldıktan sonraki tüm sayıların toplamı ", toplam)
cal_avg ([10,20,30,40,50])
mul_by_2([10,20,30,40,50])
örnek9.not:
Çıktı:
>> piton örneği9.p
Yukarıdaki dekoratör, herhangi bir fonksiyon için yürütme süresini hesaplamak için kullanılabilir. Bir dekoratör kullanarak, dekoratörü işlev tanımının üzerine yerleştirmek için yürütme süresini hesaplama gereksinimimiz olduğunda tekrarlanan kodu önleyebiliriz.
Sonuç:
Dekoratörler, dekore edilen işlevin orijinal kodunu değiştirmeden bir işlevin/yöntemin işlevselliğini değiştirir. Bunu kullanarak tekrarlanan kod yazmaktan kaçınabiliriz. Dekoratör kavramını bilmek bizi python'da güçlü kılacaktır. Dekoratörü aşağıdaki durumlarda kullanabiliriz:
- Python çerçevelerinde yetkilendirme Ör: Flask ve Django
- Kerestecilik
- Yürütme süresini ölçün