CodeBlanks Logo Icon CodeBlanks

Decorator temelleri

Decorator'ların nasıl çalıştığını öğrenirsin.

Süsleyici (decorator) ne demek?

Bir süsleyici (decorator), bir fonksiyonu ya da sınıfı değiştirmeden onun davranışını sararak (wrap) genişleten araçtır. Python'da süsleyici, hedefin hemen üstünde @ad biçiminde yazılır.

Örnek: @log\ndef hello():\n .... Burada log süsleyicisi, hello fonksiyonunu alıp yeni bir fonksiyonla sarar. Çağrı yine hello() şeklindedir ama arka planda sarmalanan fonksiyon çalışır. Süsleyiciler tekrar eden işleri (log, önbellek, izin) tek yerde toplar.

Süsleyici sözdizimi

Süsleyici, fonksiyon tanımından hemen önce @süsleyici_adı satırı olarak yazılır. Python bu satırı görünce target = decorator_name(target) çağrısını otomatik yapar.

Örnek: @upper\ndef hello():\n return "hi". Bu aslında hello = upper(hello) ile eşdeğerdir. Süsleyici, kendisine gelen fonksiyonu alıp yeni bir fonksiyon döndürmelidir. Çağrıdan sonra hello artık sarmalanmış halini gösterir.

Uygulama Süsleyici satırını ekle

with_log adında bir süsleyici tanımla. def with_log(fn): imzasıyla, içine def wrapper(): yaz; gövdesinde print("çağrılıyor") ve return fn() satırları olsun. return wrapper ile sarmalı döndür. Sonra @with_log ile süsle ve def hello(): tanımla, gövdede return "merhaba" yaz. En sonda print(hello()) çağrısı yapsın.

Başlangıç kodu

main.py
# with_log süsleyicisini ve hello fonksiyonunu yaz

Örnek çözüm

main.py
# with_log süsleyicisini ve hello fonksiyonunu yaz
def with_log(fn):
    def wrapper():
        print("çağrılıyor")
        return fn()
    return wrapper

@with_log
def hello():
    return "merhaba"

print(hello())

Beklenen çıktı

çağrılıyor
merhaba

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 @ad ne işe yarar?

  • Fonksiyonu kalıtım yoluyla aktarır
  • Fonksiyonu siler
  • Altındaki fonksiyonu başka bir fonksiyonla sarar Doğru cevap
  • Fonksiyon adını yeniden adlandırır

Açıklama: @ad, hedef fonksiyonu süsleyici işleviyle sarmalar.

2 Süsleyici satırını tamamla

Soru
def hello():
    return "hi"

____
def big_hello():
    return hello().upper()
Cevap
def hello():
    return "hi"

@big_hello
def big_hello():
    return hello().upper()

Açıklama: @ ile başlayan satır süsleyiciyi bağlar.

3 Süsleyici parçalarını eşleştir

Kavram Anlamı
@ Süsleyici işareti
name Süsleyici işlevi
def target(): Süslenen fonksiyon
target = name(target) Eşdeğer atama

Orta seviye bölümündeki tüm dersler