- Bağlantıyı al
- X
- E-posta
- Diğer Uygulamalar
- Bağlantıyı al
- X
- E-posta
- Diğer Uygulamalar
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.
Dekoratörleri anlamak için iki temel konsepti hatırlamalıyız:
Bir fonksiyonun içinde başka bir fonksiyon tanımlanabilir. İçteki fonksiyon, sadece dıştaki fonksiyon çalıştığında var olur.
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!
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!
Bir dekoratör, genellikle şu adımları izler:
Dış fonksiyon (Dekoratör) tanımlanır, bu, dekore edilecek fonksiyonu argüman olarak alır.
İçinde, orijinal fonksiyonu çağırmadan önce/sonra/etrafında çalışacak mantığı barındıran iç (wrapper) bir fonksiyon tanımlanır.
İç fonksiyon, orijinal fonksiyonu çalıştırır ve gerekirse onun sonucunu döndürür.
Dış fonksiyon, iç fonksiyonu döndürür.
Örnek: Zamanlama Dekoratörü
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
@ 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):
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.
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.
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.
Yorumlar
Yorum Gönder