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