CodeBlanks Logo Icon CodeBlanks

__init_subclass__

__init_subclass__ ile alt sınıf hook'unu öğrenirsin.

__init_subclass__ nedir?

__init_subclass__, bir üst sınıfın alt sınıf yaratıldığında haberdar olmasını sağlar. Metaclass yazmadan benzer davranışı elde etmenin sade yoludur.

class Base içinde def __init_subclass__(cls, **kwargs) tanımlarsın. class Dog(Base) yazıldığında Python otomatik olarak Base.__init_subclass__'ı cls=Dog ile çağırır. super().__init_subclass__(**kwargs) çağrısı zinciri sürdürür. Böylece alt sınıfları kaydedebilir, doğrulayabilirsin.

kwargs ile yapılandırma

__init_subclass__'a anahtar-değer çiftleri geçirebilirsin. class Dog(Base, tag="evcil") yazınca kwargs sözlüğünde tag bulunur.

Bu desen, bildirimsel yapılandırma sağlar. Üst sınıf kwargs içindeki değerleri okuyup alt sınıfa öznitelik olarak ekleyebilir. super().__init_subclass__(**kwargs) çağrısı, işlenmemiş anahtarları zincirdeki sonraki sınıfa iletir. Böylece her sınıf kendi ilgilendiği anahtarları işler.

Uygulama Base sınıfı ile alt sınıf kaydı

Bir Base sınıfı yaz. Sınıf düzeyinde registry = [] listesi olsun. __init_subclass__(cls, **kwargs) tanımla: önce super().__init_subclass__(**kwargs) çağır, sonra cls.__name__'i cls.registry listesine ekle. Dog(Base) alt sınıfı tanımla. Base.registry'yi yazdır.

Başlangıç kodu

main.py
# Base sınıfına __init_subclass__ ekle
# alt sınıfları bir listeye kaydet
# Dog sınıfını tanımla ve yazdır

Örnek çözüm

main.py
# Base sınıfına __init_subclass__ ekle
class Base:
    registry = []
    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        cls.registry.append(cls.__name__)

class Dog(Base):
    pass

print(Base.registry)

Beklenen çıktı

['Dog']

Soru ve cevaplar

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

1 __init_subclass__ kavramlarını eşleştir

Kavram Anlamı
__init_subclass__ Alt sınıf kancası
cls Yeni alt sınıf
super() Zinciri sürdürür
**kwargs Ek yapılandırma

2 __init_subclass__ ne zaman çağrılır?

main.py
class Base:
    def __init_subclass__(cls):
        print("alt sinif")

class Dog(Base):
    pass
  • Dog() çağrıldığında
  • Dog sınıfı tanımlanırken Doğru cevap
  • Base() çağrıldığında
  • Program kapanırken

Açıklama: __init_subclass__, Dog sınıfı tanımlandığı an çağrılır; örnek oluşturmayla ilgisi yoktur.

3 __init_subclass__ imzasını tamamla

Soru
def __init_subclass__(cls, ____):
    super().__init_subclass__(**kw)
Cevap
def __init_subclass__(cls, **kwargs):
    super().__init_subclass__(**kw)

Açıklama: **kwargs, ek anahtar-değer çiftlerini yakalar.

Uzman bölümündeki tüm dersler