# # Python Kalıtım

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.

```python
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.&#x20;

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.

```python
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.

```python
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.

```python
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.&#x20;

## 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.

```python
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.

```python
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.

```python
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
```
