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