Class decorator
- Python kursu
- İleri seviye
- Ders 2/83
- 5 dk
Sınıf tabanlı decorator'ı öğrenirsin.
Class decorator
Bir class decorator, bir sınıfı __call__ metoduyla çağrılabilir hâle getirir ve fonksiyon yerine bu sınıfı decorator olarak kullanır. Nesne, fonksiyon gibi davranır.
Avantajı: sarmalama sırasında durum tutabilir. Örneğin kaç kez çağrıldığını bir örneklek değişkende sayabilirsin. Yapı şöyledir:
class Counter:
def __init__(self, fn):
self.fn = fn
self.count = 0
def __call__(self, *args):
self.count += 1
return self.fn(*args)@Counter ile süslenen fonksiyon artık bir Counter örneğidir; fn.count çağrı sayısını verir.
Class decorator ile durum takibi
Class decorator'lerin güçlü tarafı durum tutabilmeleridir. Çağrı sayacı, önbellek veya zaman damgası gibi bilgileri örneklek değişkenlerde saklarsın.
Örnek: her çağrıda çağrım sayısını artırır ve sonucu döner. @Counter ile süslenmiş square(x) fonksiyonu üç kez çağrılırsa square.count değeri 3 olur.
İçeride self.fn(*args) çağrısı orijinal fonksiyonu çalıştırır; self.count += 1 ise sayacı günceller. Durum, örneğe bağlı kalır; global değişken gerekmez.
Uygulama Class decorator ile çağrı sayacı
Counter adında bir class decorator yaz. __init__(self, fn) fonksiyonu self.fn'e atayıp self.count değerini 0 yapsın. __call__(self, *args) her çağrıda self.count'u bir artırıp self.fn(*args) sonucunu döndürsün. @Counter ile süslenmiş square(x) fonksiyonu x * x döndürsün. square(3), square(4) ve square(5) çağrılarını yap; son olarak print(square.count) yaz.
Başlangıç kodu
# Counter: class decorator, __init__ ve __call__ ile
# __init__ fn'i ve count değerini tutsun
# __call__ count'u artırıp fn'i çağırıp döndürsün
@Counter
def square(x):
return x * x
square(3)
square(4)
square(5)
print(square.count)Örnek çözüm
class Counter:
def __init__(self, fn):
self.fn = fn
self.count = 0
def __call__(self, *args):
self.count += 1
return self.fn(*args)
@Counter
def square(x):
return x * x
square(3)
square(4)
square(5)
print(square.count)Beklenen çıktı
3
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Class decorator'da çağrı metodu
class Counter:
def __init__(self, fn):
self.fn = fn
self.count = 0
def ____(self, *args):
self.count += 1
return self.fn(*args)
class Counter:
def __init__(self, fn):
self.fn = fn
self.count = 0
def __call__(self, *args):
self.count += 1
return self.fn(*args)
Açıklama: __call__ metodu bir örneği çağrılabilir yapar; decorator davranışı buradan gelir.
2 Class decorator bir fonksiyon bilgisini nerede saklar?
- Global değişkende
- Örneklek değişkende (self.count gibi) Doğru cevap
- Yerel değişkende
- Modül düzeyinde sabitte
Açıklama: Class decorator durumu self ile başlayan örneklek değişkenlerde tutar; her örneğin kendi sayacı olur.
3 Class decorator parçalarını eşleştir
| Kavram | Anlamı |
|---|---|
__init__(self, fn) |
Orijinal fonksiyonu tutar |
__call__(self, *args) |
Çağrıldığında çalışır |
self.count |
Durum özelliği |
self.fn(*args) |
Orijinal fonksiyonu çağırır |