Miras kavramı, nesne tabanlı programlamada bir başka sınıfın tüm özellik ve metodlarını alan bir sınıf tanımlayabilmemizi sağlar. Bir başka deyişle, başka bir sınıfın tüm mirasına sahip yeni bir sınıf oluşturmamıza izin verir.

Ana sınıf, miras alınan sınıftır ve aynı zamanda temel sınıf olarak da isimlendirilir. Alt sınıf, türetilmiş sınıf olarak da adlandırılan başka bir sınıftan miras alan sınıftır.

Ana sınıf oluşturmak için özel bir tanımlamaya gerek yoktur, her sınıf ana sınıf olabilir. Alt sınıfı oluşturmak için ise, sınıf oluştururken ana sınıfı parametre olarak veririz. Şimdi daha önceki sınıf konusunda tanımladığımız Personel() sınıfını ele alalım ve bu sınıftan bir alt sınıf oluşturalım:

class ArayuzGelistirici(Personel):
    pass

Henüz bu sınıfa ait bir özellik ya da metod oluşturmak istemediğimiz için pass anahtar kelimesi ile bu kısmı geçtik. Ama halihazırda miras aldığı Personel() sınıfının tüm özellik ve metodlarını kullanabilir. Bunu görmek için bir nesne tanımlayalım;

class ArayuzGelistirici(Personel):
  pass

personel4=ArayuzGelistirici("Vural","Şahin",("ReactJS","jQuery"),6)
print("Personel Ad-Soyad: " + personel4.ad + " " + personel4.soyad)
print("Deneyim Süresi: " , personel4.deneyimSuresi)
print("Kullandığı Programlama Dilleri: ")
personel4.dilYazdir()

Çıktı:

Personel Ad-Soyad: Vural Şahin
Deneyim Süresi: 6
Kullandığı Programlama Dilleri: 
- ReactJS
- jQuery

Gördüğünüz gibi ArayuzGelistirici() sınıfı içinde herhangi bir özellik ya da metod olmamasına rağmen hata almadık, çünkü Personel() sınıfının özellik ve metodlarını kullanabiliyor.

Alt Sınıfa __init__() Fonksiyonu Eklemek

Eğer alt sınıf içinde kendi __init__() fonksiyonunu yazarsanız, miras alınan sınıfın __init__() fonksiyonu içinde tanımlanan özellikleri kullanamazsınız. Sadece alt sınıfın __init__() fonksiyonunu kullanabilirsiniz.

Eğer hem ana sınıfın __init__() fonksiyonundan faydalanmak hem de kendi __init__() fonksiyonu içeriğinizi oluşturmak istiyorsanız ana sınıfın __init__() foksiyonuna çağrı yaparak ekleyebilirsiniz. Burada dikkat etmeniz gereken husus, alt sınıfın __init__() fonksiyonuna ana sınıfın __init__() fonksiyonundaki parametrelerin tamamını ve yeni parametreleri eklemeniz gerektiğidir;

class Personel:
  def __init__(kisi,ad,soyad, programlamaDili, deneyimSuresi):
    kisi.ad=ad
    kisi.soyad=soyad
    kisi.programlamaDili=programlamaDili
    kisi.deneyimSuresi=deneyimSuresi

  def dilYazdir(kisi):
    veriTuru=type(kisi.programlamaDili)
    if veriTuru is str:
      print("  - ", kisi.programlamaDili)
    elif veriTuru is tuple or list:
      for dil in kisi.programlamaDili:
        print("  - ", dil)
    else:
      print("Hatalı bir veri girişi yapılmış!")

class SunucuTarafiGelistirici(Personel):
  def __init__(kisi, ad, soyad, programlamaDili, deneyimSuresi, konum, egitim):
    Personel.__init__(kisi, ad, soyad, programlamaDili, deneyimSuresi)
    kisi.konum=konum
    kisi.egitim=egitim

# SunucuTarafiGelistirici() sınıfından bir nesne oluşturalım
personel5=SunucuTarafiGelistirici("Buğra","Moralı",("NodeJS","PHP","Python"),9,"İzmir","Yazılım Mühendisi")

# Ana sınıf ve alt sınıfın özellik ve fonksiyonlarını kullanalım
print("Personel Ad-Soyad: " + personel5.ad + " " + personel5.soyad)
print("Deneyim Süresi: " , personel5.deneyimSuresi)
print("Kullandığı Programlama Dilleri: ")
personel5.dilYazdir()
print("Yaşadığı Şehir: " + personel5.konum)
print("Eğitim: " + personel5.egitim)

Çıktı:

Personel Ad-Soyad: Buğra Moralı
Deneyim Süresi: 9
Kullandığı Programlama Dilleri: 
- NodeJS
- PHP
- Python
Yaşadığı Şehir: İzmir
Eğitim: Yazılım Mühendisi

 

Python’da ana sınıfın tüm özellik ve fonksiyonlarını miras almak için kullanabileceğiniz super() isimli bir fonksiyon da mevcuttur. Bu fonksiyonu kullandığınızda, ana sınıfın adını kullanmanıza gerek kalmaz, otomatik olarak ana sınıfın özellik ve metodlarını alır. Yukarıdaki SunucuTarafiGelistirici() sınıfımızı şu şekilde de tanımlayabilirdik;

class SunucuTarafiGelistirici(Personel):
  def __init__(kisi, ad, soyad, programlamaDili, deneyimSuresi, konum, egitim):
    super().__init__(ad, soyad, programlamaDili, deneyimSuresi)
    kisi.konum=konum
    kisi.egitim=egitim

Benzer şekilde alt sınıf içinde dilediğiniz şekilde yeni metodlar tanımlayıp aynı anda hem ana sınıfın metodlarını hem de alt sınıfın metodlarını kullanabilirsiniz. Ancak metodlar aynı isme sahip olurlarsa eğer alt sınıf içinde kendi fonksiyonunu kullanacağını unutmayınız. Bu duruma da Üst Fonksiyonu Geçersiz Kılma(Function Overriding) adını veriyoruz.

 

Bu konudaki örneklere şu adreste göz atabilirsiniz;

https://repl.it/@ObenSEVEN/oop