CodeBlanks Logo Icon CodeBlanks

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.

Başlangıç kodu

main.py
# 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

main.py
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

Soru
class Counter:
    def __init__(self, fn):
        self.fn = fn
        self.count = 0

    def ____(self, *args):
        self.count += 1
        return self.fn(*args)
Cevap
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

İleri seviye bölümündeki tüm dersler