Python
Class decorator
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.
Örnek çözümü göster
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)
Kendini test et
-
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)
Cevabı göster
class Counter:
def __init__(self, fn):
self.fn = fn
self.count = 0
def __call__(self, *args):
self.count += 1
return self.fn(*args)
-
Class decorator bir fonksiyon bilgisini nerede saklar?
- Global değişkende
- Örneklek değişkende (self.count gibi)
- Yerel değişkende
- Modül düzeyinde sabitte
Cevabı göster
Örneklek değişkende (self.count gibi) — Class decorator durumu self ile başlayan örneklek değişkenlerde tutar; her örneğin kendi sayacı olur.
-
Class decorator parçalarını eşleştir
- __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
Sıradaki ders: functools