python dersleri

Python Multiple Inheritance (Çoklu Miras Alma)

Merhaba Arkadaşlar,
Mobilhanem.com da Python Eğitimi Serisinin bu dersinde önemli bir kavram olan Multiple Inheritance (Çoklu Miras Alma) dersi ile birlikteyiz. Bir önceki dersimizde nesne tabanlı programlamada önemli bir kavram olan Inheritance(Miras Alma) görmüştük. Bu derste ise Multiple Inheritance (Çoklu miras alma) nedir? Nasıl kullanılır ve avantajları nedir? Sorularına cevap verip örnek uygulamalar ile göstereceğiz.

Python Multiple Inheritance (Çoklu Miras Alma)

Bir önce ki dersimizde miras alma konusunu anlatırken bir sınıf başka bir sınıfın özellik ve işlevlerini alıyordu. Peki çoklu miras alma nedir? Çoklu miras alma bir sınıfın birden fazla sınıfın özelliklerini ve işlevlerini almasıdır.

Gerçek hayatta bir çocuğun hem anne hem de babasının özelliklerini taşıması gibi :)) hemen kodlamaya başlayalım, çok daha iyi anlayacaksınız.

class Anne:
    def print_Anne(self):
        print("Anne sınıfının özellikleri")

class Baba:
    def print_Baba(self):
        print("Baba sınıfının özellikleri")

class Cocuk(Anne,Baba):
    pass

object_d = Cocuk()
object_d.print_Anne()
object_d.print_Baba()

Çıktıya bakalım hemen;

Anne sınıfının özellikleri
Baba sınıfının özellikleri

Gördüğünüz gibi birden fazla sınıfın fonksiyonunu aldık ve kullandık.

Ama çoklu fonksiyonlarda dikkat etmemiz gereken çok önemli bir nokta var aynı isimde sadece bir sınıf, bir özellik veya bir işlev(fonksiyon) kullanabiliyoruz hemen örnek verelim.

class Anne:

    def goz_rengi(self):
        print("Anne sınıfının özellikleri")

class Baba:
    def goz_rengi(self):
        print("Baba sınıfının özellikleri")



class Cocuk(Anne,Baba):
    pass

object_d = Cocuk()
object_d.goz_rengi()

Hem Anne() sınıfı hem de Baba() isimli sınıfında goz_rengi() özelliği var.

Peki Cocuk() sınıfı hangi sınıfın özelliğini miras alacak hemen bakalım.

Anne sınıfının özellikleri

Tahmin ettiğimiz gibi anne sınıfının özelliklerini aldı. Çünkü ilk önce Anne() sınıfı özelliklerini miras aldı. Şimdi değiştirelim ve bu sefer Baba() sınıfını önce miras alalım.

class Cocuk(Baba,Anne):
    pass

ilk önce Baba() sınıfını miras aldık hemen çıktımıza bakalım.

Baba sınıfının özellikleri

Şimdi siz diyeceksiniz  ki ben aynı isimde niye fonksiyon oluşturayım ki ben farklı isimde fonksiyon oluşturacağım. Ama şunu unutmayın bir projede tek başınıza olmayabilirsiniz. Birden çok kişi ile çalıştığınızda bu gibi sorunlarla karşılaşabilirsiniz. Gelelim r __init__() yapıcı fonksiyonu her iki sınıfta varsa o zaman ne yapacağımız konusuna. Hemen gösterelim;

class Anne:

    def __init__(self):
        self.goz_rengi =  "Yeşil"
        print(self.goz_rengi)

class Baba:
    def __init__(self):
        self.goz_rengi = "Siyah"
        print(self.goz_rengi)

class Cocuk(Baba,Anne):
    pass

object_d = Cocuk()

Gördüğünüz gibi kodumuzu çalıştırdığımız zaman

Siyah

Şeklinde bir çıktı aldık. Yani Baba() sınıfını ilk önce miras aldığımız için   Baba() sınıfının özelliğini öncelik aldı. Peki siz şimdi diyeceksiniz ki biz  yeri geldiğinde bu öncelik sırasını kendimiz değiştiremiyor muyuz? Elbette değiştirebilirsiniz nasıl mı hemen gösterelim.

Çoklu Miras Alma da Yapıcı Fonksiyon

class Cocuk(Baba,Anne):
    def __init__(self):
        Anne.__init__(self)

object_d = Cocuk()

Çıktıya bakalım;

Yeşil

Biz burada Anne() sınıfının __init__() fonksiyonunu öncelik aldık. Cümleye biraz dikkat ederseniz Anne() sınıfının bütün özellik ve işlevlerini değil sadece __init__() fonksiyonu aldık. Buradan nasıl bir bilgiye ulaşabiliriz. Hemen anlatayım biz Anne() sınıfının  __init__() fonksiyonunu öncelik verirken Baba() sınıfının da diğer bir fonksiyonunu öncelik verebiliriz.

Hemen bir örnekle gösterelim.

class Anne:

    def __init__(self):
        self.goz_rengi =  "Yeşil"
        print(self.goz_rengi)

    def boyu(self):
        self.boyu = 1.70
        print(self.boyu)

class Baba:
    def __init__(self):
        self.goz_rengi = "Siyah"
        print(self.goz_rengi)

    def boyu(self):
        self.boyu = 1.86
        print(self.boyu)

class Cocuk(Baba,Anne):
    def __init__(self):
        Anne.__init__(self)

object_d = Cocuk()
object_d.boyu()

Çıktıya bakalım hemen

Yeşil
1.86

Gördüğünüz gibi çocuk göz rengi özelliğini Anne den alırken boy özelliğini Babadan aldı. Sebebi ise biz Baba() sınıfını önce yazdığımız için Baba() sınıfının boy() fonksiyonunu miras aldı.  Ama biz Anne() sınıfının __init__() fonksiyonunu öncelik olarak belirttiğimiz için Anne sınıfının __init__() fonksiyonunu öncelik olarak miras aldı.

Eğer yine aynı şekilde Anne() sınıfının boy() fonksiyonuna öncelik verseydik Anne() sınıfının boy() fonksiyonu alırdı.

Hemen değiştirelim.

class Anne:

    def __init__(self):
        self.goz_rengi =  "Yeşil"
        print(self.goz_rengi)

    def boy(self):
        self.boyu = 1.75
        print(self.boyu)

class Baba:
    def __init__(self):
        self.goz_rengi = "Siyah"
        print(self.goz_rengi)

    def boy(self):
        self.boyu = 1.86
        print(self.boyu)

class Cocuk(Baba,Anne):
    def __init__(self):
        Anne.__init__(self)

    def boy(self):
        return Anne.boy(self)

object_d = Cocuk()
object_d.boy()

Çıktıya baktığımız  zaman her iki özelliği de Anne() sınıfından miras aldığını göreceksiniz.

Yeşil
1.75

Gördüğünüz gibi Baba() sınıfı ilk önce yazmamıza rağmen Anne() sınıfının özelliklerine öncelik verdiğimiz için Anne() sınıfının özelliklerini aldı.

Peki siz sormadan hemen ben sorayım miras almış bir sınıfı yani Cocuk() sınıfını biz başka bir sınıfta miras alabilir miyiz? Hemen bakalım;

class Torun(Cocuk):
    pass

torun = Torun()
torun.goz_rengi
torun.boy()

Hemen çıktıya bakalım;

Yeşil
1.75

Gördüğünüz gibi Cocuk() sınıfını miras alabiliyoruz. Cocuk() sınıfının miras aldığı özellikleri aynı zaman da Torun() sınıfı içinde geçerli. Anne() sınıfının özelliklerini neden aldığını artık çok iyi bildiğinize inanıyorum.

Mobilhanem.com da Multiple Inheritance (Çoklu Miras Alma) dersinin  sonuna geldik bir sonraki yazıda görüşmek üzere eğer anlamadığınız eksik yer varsa Soru-Cevap kısmından veya dersin altında yorum kısmından çekinmeden iletişime geçebilirsiniz.

Tüm Python dersleri için buraya tıklayın.

36

Cahit İşleyen

Data Scientist at @Embedica.ai
Python ve Linux sever.
Çay tiryakisi

1 Yorum

  • Allah razı olsun Django hariç tüm seriyi 3-4 günde bitirdim.(tabi burada c++ biliyor olmam çok ciddi rol oynadı). Kesinlikle python için olabilecek en öz türkçe tutorial bu olsa gerek. Yazılımcı olmayı hedeflemiyorum ama bu yolda ilerlemek isteyen arkadaşlar için harici kaynak olarak YazBel python serisini de öneririm. Tekrardan teşekkürlerimi sunuyorum.

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?