Resim

Python Decorators (Dekoratörler)

Python Decorators (Dekoratörler): Fonksiyonları Kapsülleme ve Davranışlarını Genişletme

Fonksiyon Üzerine Fonksiyon

Merhaba! Python'da her şey bir nesnedir, ve bu kural fonksiyonlar için de geçerlidir. Fonksiyonları bir değişkene atayabilir, başka bir fonksiyona argüman olarak geçirebilir ve hatta bir fonksiyonun içinde başka bir fonksiyon tanımlayabiliriz.

Dekoratör (Decorator), işte bu özelliğin nihai uygulamasıdır. Basitçe tanımlarsak:

Dekoratör, girdi olarak bir fonksiyon alan ve çıktı olarak, girdi fonksiyonunun orijinal işlevselliğini koruyarak ek özellikler eklenmiş yeni bir fonksiyon döndüren bir fonksiyondur.

Bu yapı, özellikle web çerçevelerinde (Flask, Django) kullanıcı yetkilendirmesi, URL yönlendirmesi veya performans ölçümü gibi tekrarlanan görevleri uygulamak için vazgeçilmezdir.


1. Ön Koşul: İçiçe ve Yüksek Dereceli Fonksiyonlar

Dekoratörleri anlamak için iki temel konsepti hatırlamalıyız:

a. İçiçe (Nested) Fonksiyonlar

Bir fonksiyonun içinde başka bir fonksiyon tanımlanabilir. İçteki fonksiyon, sadece dıştaki fonksiyon çalıştığında var olur.

def dis_fonksiyon():

    mesaj = "Merhaba"
    def ic_fonksiyon():
        print(mesaj + " Dünya") # İç fonksiyon, dıştaki değişkeni 
kullanabilir (Kapanım)
    
    return ic_fonksiyon # Fonksiyonu döndürür, çağırmaz!

b. Fonksiyonu Değişkene Atama ve Argüman Olarak Geçme

Python'da fonksiyonlar, diğer değişkenler gibi ele alınır.

def merhaba():
    return "Selam!"

# Fonksiyonu bir değişkene atama
yeni_selam = merhaba

print(yeni_selam()) # Çıktı: Selam!

Kendiniz Deneyebilirsiniz:


2. Dekoratörlerin Temel Yapısı

Bir dekoratör, genellikle şu adımları izler:

  1. Dış fonksiyon (Dekoratör) tanımlanır, bu, dekore edilecek fonksiyonu argüman olarak alır.

  2. İçinde, orijinal fonksiyonu çağırmadan önce/sonra/etrafında çalışacak mantığı barındıran iç (wrapper) bir fonksiyon tanımlanır.

  3. İç fonksiyon, orijinal fonksiyonu çalıştırır ve gerekirse onun sonucunu döndürür.

  4. Dış fonksiyon, iç fonksiyonu döndürür.

  • Örnek: Zamanlama Dekoratörü

import time
def zaman_olc(func):
    """Dekoratör: Çalışma süresini ölçer."""
    def sarmalayici_fonksiyon(*args, **kwargs):
        baslangic = time.time()
        sonuc = func(*args, **kwargs) # Orijinal fonksiyonu çalıştır
        bitis = time.time()        
        print(f"'{func.__name__}' fonksiyonu 
{bitis - baslangic:.4f} saniye sürdü.")
        return sonuc
    return sarmalayici_fonksiyon

Kendiniz Deneyebilirsiniz:


3. @ Söz Dizimi (Syntactic Sugar)

Python, bir fonksiyonu dekore etmeyi çok kolaylaştıran @ işaretini sunar. Bu işaret, bir fonksiyon tanımının hemen üzerine konur ve yukarıda tanımladığımız manuel atamayı otomatik olarak yapar.

Manuel Atama (Zahmetli Yol):

def hesaplama():
    # Uzun süren bir işlem
    return sum(range(100000))
hesaplama = zaman_olc(hesaplama)#Fonksiyonu dekore et ve üzerine yaz

Dekoratör Söz Dizimi (@ ile):

@zaman_olc # zaman_olc dekoratörünü kullan
def hesaplama():
    # Uzun süren bir işlem
    time.sleep(1) # Örnek gecikme
    return sum(range(100))
# Şimdi, 'hesaplama' çağrıldığında otomatik olarak zaman_olc çalışır hesaplama() 
# Çıktı: 'hesaplama' fonksiyonu 1.0005 saniye sürdü.

Kendiniz Deneyebilirsiniz:

4. Dekorasyonun Uygulama Alanları

  • Yetkilendirme: Bir web uygulaması fonksiyonunu çalıştırmadan önce kullanıcının giriş yapıp yapmadığını veya yönetici yetkisine sahip olup olmadığını kontrol etme.

  • Logging (Kayıt Tutma): Bir fonksiyon her çağrıldığında, hangi parametrelerle çağrıldığı bilgisini sisteme kaydetme.

  • Önbellekleme (Caching): Aynı parametrelerle tekrar çağrılırsa fonksiyonu tekrar çalıştırmak yerine önceki sonucu döndürme.

  • Hata İşleme: Fonksiyon içinde bir hata oluşursa, bunu zarifçe yakalama ve ek mesajlar gösterme.


Kodun Güçlendiricisi

Dekoratörler, Python'ın en ileri seviye konularından biridir. Karmaşık kod mantığını ve çapraz kesen endişeleri (cross-cutting concerns) ana iş mantığından ayırarak, daha temiz, daha DRY (Kendini Tekrar Etme) ve daha yönetilebilir kod yazmanıza olanak tanır. Bir kez anlaşıldığında, Python'daki verimliliğiniz katlanarak artacaktır.

🔥 Python Kariyerinizi Hemen Başlatın!

Hemen kursumuza kaydolun ve bu güçlü araçları kullanarak profesyonel Python geliştiricisi olma yolunda ilk adımı atın. Kursumuzdaki uygulamalı modüller, sizi sadece bir yazılımcı adayı değil, hazır bir profesyonel haline getirecek. Python Eğitimini Udemy platformunda bulabilirsiniz.

[ Python Eğitimi Sıfırdan İleri Seviye ]

Tıklayın ve Python Eğitimine Hemen Kaydolun!

Yorumlar

Bu blogdaki popüler yayınlar

Python random Modülü

Python print()

Yazılım Nedir?