Decorator temelleri
- Python kursu
- Orta seviye
- Ders 36/116
- 5 dk
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
# with_log süsleyicisini ve hello fonksiyonunu yazÖrnek çözüm
# 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
def hello():
return "hi"
____
def big_hello():
return hello().upper()
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 |