Python Dekoratörler

Bir dekoratör bir işlevi alır, bazı işlevler ekler ve onu döndürür. Bu eğitimde, bir dekoratörü nasıl oluşturabileceğinizi ve onu neden kullanmanız gerektiğini öğreneceksiniz.

Python’da Dekoratörler

Python, mevcut bir koda işlevsellik eklemek için dekoratörler adı verilen ilginç bir özelliğe sahiptir .

Buna metaprogramlama da denir, çünkü programın bir kısmı derleme zamanında programın başka bir bölümünü değiştirmeye çalışır.


Dekoratörleri öğrenmek için ön koşullar

Dekoratörleri anlamak için önce Python’da birkaç temel şeyi bilmeliyiz.

Python’daki her şeyin (Evet! Sınıflar bile) nesneler olduğu konusunda rahat olmalıyız . Tanımladığımız isimler basitçe bu nesnelere bağlı tanımlayıcılardır. İşlevler istisna değildir, onlar da nesnelerdir (niteliklerle). Aynı işlev nesnesine çeşitli farklı adlar bağlanabilir.

İşte bir örnek.

Çıktı

Kodu çalıştırdığınızda hem çalışır hem firstde secondaynı çıktıyı verir. Burada isimler firstve secondaynı fonksiyon nesnesine atıfta bulunur.

Şimdi işler daha da tuhaflaşmaya başladı.

Fonksiyonlar, başka bir fonksiyona argüman olarak iletilebilir.

Python’da ve gibi işlevleri kullandıysanız map, bunu zaten biliyorsunuzdur.filterreduce

Diğer işlevleri bağımsız değişken olarak alan bu tür işlevlere yüksek dereceli işlevler de denir . İşte böyle bir işlevin bir örneği.

Fonksiyonu aşağıdaki gibi çağırıyoruz.

Ayrıca, bir işlev başka bir işlevi döndürebilir.

Çıktı

Burada, is_returned()her çağırdığımızda tanımlanan ve döndürülen iç içe bir işlevdir is_called().

Son olarak, Python’daki C kayıpları hakkında bilgi sahibi olmalıyız .


Dekoratörlere geri dönmek

Fonksiyonlar ve metotlar çağrılabildiklerinden callable olarak adlandırılırlar.

Aslında, özel __call__()yöntemi uygulayan herhangi bir nesne çağrılabilir olarak adlandırılır. Yani, en temel anlamda, bir dekoratör, çağrılabilir bir çağrı döndüren bir çağrılabilir.

Temel olarak, bir dekoratör bir işlevi alır, bazı işlevler ekler ve onu döndürür.

Aşağıdaki kodları Shell’de çalıştırdığınızda,

Yukarıda gösterilen örnekte make_pretty(), bir dekoratördür. Atama adımında:

Fonksiyon ordinary()dekore edilmiş ve döndürülen fonksiyona isim verilmiştir pretty.

Dekoratör işlevinin orijinal işleve bazı yeni işlevler eklediğini görebiliriz. Bu bir hediyeyi paketlemeye benzer. Dekoratör bir sarıcı görevi görür. Süslenen nesnenin (içerideki gerçek hediye) niteliği değişmez. Ama şimdi güzel görünüyor (süslendiğinden beri).

Genel olarak, bir işlevi dekore eder ve onu şu şekilde yeniden atarız:

Bu yaygın bir yapıdır ve bu nedenle Python’un bunu basitleştirmek için bir sözdizimi vardır.

Sembolü, dekoratör fonksiyonunun adıyla birlikte kullanabilir ve @dekore edilecek fonksiyonun tanımının üstüne yerleştirebiliriz. Örneğin,

eşdeğerdir

Bu, dekoratörleri uygulamak için sadece sözdizimsel bir şekerdir.


Parametrelerle Dekorasyon Fonksiyonları

Yukarıdaki dekoratör basitti ve sadece herhangi bir parametresi olmayan fonksiyonlarla çalıştı. Ya aşağıdaki gibi parametreleri alan fonksiyonlarımız olsaydı:

Bu fonksiyonun iki parametresi vardır,aveb. Geçersek hata vereceğini biliyoruz.b0 olarak

Şimdi hataya neden olacak bu durumu kontrol etmek için bir dekoratör yapalım.

Bu yeni uygulama None, hata durumu ortaya çıkarsa geri dönecektir.

Bu şekilde parametre alan fonksiyonları süsleyebiliriz.

Keskin bir gözlemci inner(), dekoratörün içindeki iç içe işlevin parametrelerinin, süslediği işlevlerin parametreleriyle aynı olduğunu fark edecektir. Bunu dikkate alarak artık istediğimiz sayıda parametre ile çalışan genel dekoratörler yapabiliriz.

Python’da bu sihir şu şekilde yapılır function(*args, **kwargs). Bu şekilde, konumsal argümanların demetiargs olacak ve anahtar kelime argümanlarının sözlüğü olacaktır . Böyle bir dekoratörün bir örneği şöyle olacaktır:kwargs


Python’da Dekoratörleri Zincirleme

Python’da birden fazla dekoratör zincirlenebilir.

Yani bir fonksiyon farklı (veya aynı) dekoratörlerle birden çok kez dekore edilebilir. Basitçe dekoratörleri istenen fonksiyonun üzerine yerleştiririz.

Çıktı

Yukarıdaki sözdizimi,

eşdeğerdir

Dekoratörleri zincirleme sıramız önemlidir. Sıralamayı tersine çevirseydik,

Çıktı şöyle olacaktır:

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.