Python’da Decorator Mantığı
Herkese merhaba, python öğrenme sürecimde, daha sonra hatırlamak için Python’da decorator mantığını yazıya dökmeye karar verdim.
Öncelikle decorator nedir, ne iş yapar ona bakalım.
Python’da bir decorator, fonksiyonların işlevselliğini değiştirmeye veya genişletmeye yarayan bir işlevdir. Decorator’lar, mevcut bir fonksiyona başka bir fonksiyonu ekleyerek veya onu sarmalayarak çalışır. Bu, fonksiyonların kodunu değiştirmeden veya yeniden yazmadan özel işlevselliği eklemek için kullanışlı bir yoldur.
Daha anlaşılır olması adına gerçek hayattan bir örnek vererek de decorator mantığını kavrayabiliriz.
Bir restoran düşünelim. Restoranın menüsünde birçok yemek vardır ve müşteriler yemeklerin hazırlanmasını beklerler. Ancak bazı müşteriler, belirli bir yemeğin hazırlanması için özel isteklerde bulunabilirler. Bu özel istekler, yemeğin normal hazırlanma sürecine eklenir ve yemeğin son halini etkiler.
Benzer şekilde, Python’da bir fonksiyon normal şekilde çalışırken, bazı özel durumlarda farklı davranmasını isteyebiliriz. Bu özel durumlara, fonksiyonun normal çalışma sürecine eklenen özellikler veya işlevler ekleyebiliriz. İşte burada, Python decorator’ları devreye girer.
Örneğin, bir restoranda müşterinin yemeğindeki sos miktarını kontrol etmek isteyen bir fonksiyon oluşturabiliriz. Ancak, her müşteri için farklı sos miktarları belirlemek zorunda kalmak yerine, bir decorator kullanarak fonksiyonu özelleştirebiliriz.
Şimdi tekrar teknik kısma dönelim.
Decorator’lar, @decorator_function
adı verilen özel bir sözdizimi kullanılarak tanımlanır. Bu, decorator fonksiyonunu tanımlamak için kullanılan bir işlevdir. Decorator fonksiyonu, orijinal fonksiyonu sarmalayan bir fonksiyondur ve bu sayede orijinal fonksiyonun çalışmasını genişletebilir veya değiştirebilir.
İşte bir örnek:
Bu kod, my_decorator
adlı bir decorator fonksiyonu tanımlar. say_hello
fonksiyonu @my_decorator
sözdizimi kullanılarak dekore edilir. Bu, say_hello
fonksiyonunu my_decorator
fonksiyonu ile sarmalayan ve onu değiştiren bir fonksiyon oluşturur.
my_decorator
fonksiyonu, orijinal fonksiyondan önce ve sonra bir şeyler yapmak için kullanılır. Bu örnekte, wrapper
fonksiyonu, orijinal fonksiyondan önce "Before the function is called." yazdırır, sonra orijinal fonksiyonu (func
) çağırır ve son olarak "After the function is called." yazdırır.
Kod çalıştırıldığında, say_hello
fonksiyonu çağrıldığında aşağıdaki çıktıyı verir:
Bu örnekte, decorator fonksiyonu my_decorator
ile birlikte, orijinal fonksiyon olan say_hello
'nun işlevselliği değiştirildi. Ancak, kodu değiştirmeden dekoratörün davranışını değiştirerek, daha karmaşık fonksiyonlar için de kullanılabilir.