# Python Kalıtım

Python kalıtım (inheritance) konusunu işliyoruz.

Python sınıflar konusunu uzunca anlatmamızın ardından şimdi de kalıtım dersine geçtik. Python programlama dersinde kalıtım kullanarak bir üst sınıfın tüm değişken ve methodlarını kendi sınıfınız içinde kullanabiliriz. Kalıtımda;

  • Ebeveyn sınıf; değişkenlerini ve fonksiyonlarını kalıtım ile kullandırır.

  • Çocuk sınıf; ebeveyn sınıftan kalıtım ile değişken ve methodaları alarak kullanabilir.

1. Ebeveyn Sınıfın Oluşturulması

Bu konuyu bir önceki dersimizde detaylıca işledik. Örnek olması amacıyla şimdi de basit bir sınıf oluşturalım.

class Birey:
def __init__(self,ad,soyad):
self.ad= ad
self.soyad= soyad
def bilgiVer(self):
print("İsim: " + self.ad + " " + self.soyad)
x = Birey("Yunus", "ÖZ")
x.bilgiVer() # Yunus ÖZ

Örnekte gördüğünüz gibi basit bir sınıf oluşturduk ve ürettiğimiz nesne ile nesne özelliklerini kullanabildik. Şimdi kalıtım ile çocuk sınıf üretelim.

2. Çocuk Sınıfın Oluşturulması

Python kalıtım ile ebeveyn sınıftan çocuk bir sınıf oluşturarak ebeveyn sınıfın tüm değişkenlerini ve methodlarını alabiliriz. Böylece aynı özellikleri tekrar tekrar oluşturmamıza gerek kalmadan kullanabiliriz.

Kalıtım ile ebeveyn sınıftan çocuk sınıf üretebilmek için oluşturacağımız çocuk sınıfa ebeveyn sınıfı parametre olarak göndermemiz gerekiyor.

class Ogrenci(Birey):
pass

İşte bu örnekte gördüğünüz gibi kalıtım ile yeni oluşturduğumuz Ogrenci sınıfına Birey sınıfını ebeveyn olarak atadık ve ebeveyn sınıfın tüm değişken ve methodlarını yeni sınıfımıza dahil ettik.

class Ogrenci(Birey):
pass
y = Ogrenci("Deniz","SANCAK")
y.bilgiVer() # Deniz SANCAK

Ogrenci sınıfında hiçbir değişken ve method oluşturmamamıza rağmen Birey sınıfını kalıttığımız için onun özelliklerini kullanabildik.

3. Fonksiyon Override Etmek

Çocuk sınıf içerisinde eğer kendi fonksiyonunuzu kullanırsanız kalıtılan ebeveyn sınıfın fonksiyonu geçersiz hale gelir yani override (geçersiz kılmak) edilir.

class Ogrenci(Birey):
def bilgiVer(self):
print("Merhaba, ben " + self.ad + " " + self.soyad)
y = Ogrenci("Deniz","SANCAK")
y.bilgiVer() # Merhaba, ben Deniz SANCAK

Bu örnekte yeni bir bilgiVer() fonksiyonu tanımladığımız için ebeveyn sınıfın bilgiVer() fonksiyonunu geçersiz kıldık ve yeni bilgiVer() fonksiyonumuzu kullandık.

4. super() Fonksiyonu Kullanımı

Kalıtım ile aldığımız özellikleri override ettiğimizde artık ebeveyn sınıfın değil, çocuk sınıfın özelliklerini kullandığımızı bir üst başlıkta gördük. Şimdi ise ebeveyn sınıfın özelliklerini geçersiz kılsak bile (override) tekrardan nasıl kalıttığımız ebeveyn sınıfın özelliklerini kullanacağımızı gösterelim.

class Ogrenci(Birey):
def bilgiVer(self):
super().bilgiVer()
y = Ogrenci("Deniz","SANCAK")
y.bilgiVer() # İsim: Deniz SANCAK

Bu örnekte bilgiVer() fonksiyonunu geçersiz kılmamıza rağmen super() fonksiyonu ile ebeveyn sınıfın bilgiVer() fonksiyonunu çağırdık ve kullandık. Aynı şeyi ebeveyn sınıfın ismiyle de yapabilirsiniz fakat self terimini eklemeyi unutmayın.

class Ogrenci(Birey):
def bilgiVer(self):
Birey.bilgiVer(self)
y = Ogrenci("Deniz","SANCAK")
y.bilgiVer() # İsim: Deniz SANCAK

Bu özelliği çocuk sınıfında ilgili fonksiyonu geliştirmek için kullanabilirsiniz. Yani ebeveyn sınıfın fonksiyonunu geçersiz kılmadan ona yeni özellikler ekleyebilirsiniz.

class Ogrenci(Birey):
def __init__(self,ad,soyad,sinif):
super().__init__(ad,soyad)
self.sinif = sinif
y = Ogrenci("Deniz","SANCAK",1)
y.bilgiVer() # İsim: Deniz SANCAK
print(y.sinif) # 1