__init_subclass__
- Python kursu
- Uzman
- Ders 3/47
- 5 dk
__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
# 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
# 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?
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
def __init_subclass__(cls, ____):
super().__init_subclass__(**kw)
def __init_subclass__(cls, **kwargs):
super().__init_subclass__(**kw)
Açıklama: **kwargs, ek anahtar-değer çiftlerini yakalar.