Python’da Miras Alma (Inheritance)

Bu yazımızda, Python’da “Miras Alma” (Inheritance) konseptine odaklanacağız. Miras alma, nesne tabanlı programlamanın temel konseptlerinden biridir ve bir sınıfın başka bir sınıftan özelliklerini (nitelikler ve metotlar) almasını sağlar. Bu sayede kodun tekrar kullanılabilirliği artar ve modülerlik sağlanır. Şimdi bu konseptin nasıl çalıştığına ve nasıl uygulandığına dair detaylara birlikte göz atalım.

Python’da Miras Alma

Bir sınıfta bulunan kodları sürekli tekrarlamak yerine, bu sınıfın özelliklerini ve metotlarını kullanacak alt sınıflar oluşturabiliriz. Miras alma konseptinde, genellikle “ebeveyn” (parent) ve “çocuk” (child) olmak üzere iki sınıf yapısından bahsederiz. Child sınıf, parent sınıfın niteliklerini veya metotlarını kullanabilir. Bu nedenle, child sınıf aynı zamanda parent sınıftan türetildiği için “alt sınıf” (sub class) olarak da adlandırılır.

Bunu yapabilmek için, yani bir sınıfın başka bir sınıftan miras almasını sağlamak için, türetilen sınıfın isminden sonra parantez içinde ana sınıfın ismi belirtilir.

class Hayvan:
    def __init__(self, ad):
        self.ad = ad

    def ses_cikar(self):
        pass

class Kopek(Hayvan):
    def ses_cikar(self):
        return "Hav hav"

karakter = Kopek("Karabas")
print(karakter.ses_cikar())  # Çıktı: Hav hav

Yukarıda Kopek sınıfı, Hayvan sınıfından miras almıştır. Bu sayede Kopek sınıfı, Hayvan sınıfının tüm özelliklerine erişebilir. Kodu çalıştırmak için: Trinket

Alt Sınıfta “__init__ ()” Fonksiyonunu Kullanmak

Initializier” (başlatıcı) kelimesinden türetilen “__init__ ()” fonksiyonu bir nesne yazıldığında öncelikli olarak çalıştırılırlar. Bu fonksiyon pekala alt sınıflarda da kullanılabilir. Ancak kullanılması durumunda üst sınıfa ait “__init__ ()” fonksiyonunu otomatik olarak çağrılmayacaktır.

class Hayvan:
    def __init__(self, ad):
        self.ad = ad
        print(f"{self.ad} adlı hayvan oluşturuldu.")

    def ses_cikar(self):
        pass

class Kopek(Hayvan):
    # Kopek sınıfında kendi __init__() fonksiyonunu tanımlıyoruz.
    def __init__(self, ad):
        self.ad = ad  
        print(f"{self.ad} adlı köpek oluşturuldu.")

    def ses_cikar(self):
        return "Hav hav"

# Kopek sınıfının kendi __init__() fonksiyonu tanımlandığı için,
# sadece "Karabas adlı köpek oluşturuldu." mesajını göreceğiz.
karakter1 = Kopek("Karabas")
print(karakter1.ses_cikar())  # Çıktı: Hav hav

print("\n---\n")

class Kopek2(Hayvan):
    # Kopek2 sınıfında __init__() fonksiyonunu tanımlamıyoruz.
    def ses_cikar(self):
        return "Hav hav"

# Kopek2 sınıfında kendi __init__() fonksiyonu tanımlanmadığı için,
# Hayvan sınıfının __init__() fonksiyonu çalışacak ve 
# "Karabas adlı hayvan oluşturuldu." mesajını göreceğiz.
karakter2 = Kopek2("Karabas")
print(karakter2.ses_cikar())  # Çıktı: Hav hav

Bu şekilde, __init__ fonksiyonunun nerede ve nasıl tanımlandığına bağlı olarak hangi sınıfın __init__ fonksiyonunun çalıştığını görebilirsiniz. Kodu çalıştırmak için: Trinket

“super ()” Fonksiyonu Kullanımı

Ancak, alt sınıfın __init__() fonksiyonundan super().__init__() ile ebeveyn sınıfın __init__() fonksiyonu manuel olarak çağrılabilir.

class Hayvan:
    def __init__(self, ad):
        self.ad = ad
        print(f"{self.ad} adlı hayvan oluşturuldu.")

    def ses_cikar(self):
        pass

class Kopek(Hayvan):
    def __init__(self, ad, cins):
        # Ebeveyn sınıfın __init__() fonksiyonunu manuel olarak çağırıyoruz.
        super().__init__(ad)
        self.cins = cins
        print(f"{self.ad} adlı köpek {self.cins} cinsindedir.")

    def ses_cikar(self):
        return "Hav hav"

# Ebeveyn sınıfın (Hayvan) __init__() fonksiyonu super() ile çağrıldığı için,
# önce "Karabas adlı hayvan oluşturuldu." mesajını, ardından "Karabas adlı köpek Golden cinsindedir." mesajını göreceğiz.
karakter = Kopek("Karabas", "Golden")
print(karakter.ses_cikar())  # Çıktı: Hav hav

Bu örnekte, Kopek sınıfının __init__() fonksiyonu içerisinde super().__init__(ad) kullanılarak Hayvan sınıfının __init__() fonksiyonu manuel olarak çağrıldı. Bu sayede hem Hayvan sınıfının __init__() fonksiyonundaki işlemler gerçekleştirildi, hem de Kopek sınıfındaki ek işlemler yapıldı. Kodu çalıştırmak için: Trinket

İlgili Makaleler

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu