python dersleri

Python Inheritance (Miras Alma)

Merhaba Arkadaşlar,
Mobilhanem.com da Python Eğitimi Serisinin bu yazısında hepinizin merakla beklediği, Inheritance(Kalıtım/miras) dersi ile birlikteyiz. Bir önceki dersimizde nesne tabanlı programlamayı görmüştük. Eğer Nesne tabanlı programlamayı bilmiyorsanız  buraya bakmanızı tavsiye ederim çünkü inheritance kavramı tamamıyla nesne tabanlı programlama üzerine kurulu bir yapıdır.

Python Inheritance (Miras/Kalıtım) Nedir?

Büyük projelerde çalıştığınız zaman projenin alt modül yani alt parçacıklardan oluştuğunu ve bu alt modüllerin birçok özelliklerinin ana modülde zaten olduğunu göreceksiniz. Bunun için her seferinde alt modüller için, özellikleri ve işlevleri  oluşturmanız gerekecek buda sizin için resmen bir işkenceye dönüşüyor olacak. İşte bunun için inheritance(miras alma) kavramı ortaya çıkıyor.

Inheritance Türkçe karşılığı kalıtım veya miras alma olan bu kavram nesne tabanlı programlama(OOP) ile gelen bir kavramdır. Eğer nesne tabanlı programlama mantığını bilmiyorsanız buraya bakabilirsiniz. Nesne tabanlı programlamayı anlatırken biz her nesne için yeni bir sınıf oluşturuyorduk ve her nesnenin özellik ve işlevlerini belirtiyorduk.  İşte burada çok daha pratik olan bir yöntem olan inheritance ile artık her nesne için ayrıca özellik ve işlev belirtmeniz gerek kalmıyor. Bir defa oluşturduğunuz özellikleri tekrar tekrar kullanıyorsunuz.

Hemen günlük hayattan bir örnek verelim. Örneğin elinizde bir taşıt nesnesi var; siz araba, motosiklet gibi nesneler oluşturacaksınız. Burada araba ve motor için tekrar özellikleri yazmanıza gerek yok çünkü araba ve motosiklet nesnesinin özellikleri zaten taşıt nesnesinin içinde var. Sebebi ise araba ve motosiklet nesneleri taşıt nesnesinin birer alt kümesi.  Kafanız karıştıysa hiç merak etmeyin örnekleri yaptığımız zaman çok daha iyi anlayacaksınız.

Birçoğumuzun üniversite veya lisede gördüğü öğrenci bilgilendirme veya veli bilgilendirme sistemleri vardır. Bu sistemlerin birden fazla kullanıcı giriş sistemi vardır. Ben örnek olarak bir üniversitenin öğrenci bilgilendirme sistemini ele aldım.

Gördüğünüz gibi sisteme birden fazla farklı kullanıcı girişi var  ve bu kullanıcıların yaptıkları işlemlerin bir çoğu hemen hemen aynı. Şimdi biz bu kullanıcıları için kodları yazalım.

class Akademisyen:
    def __init__(self,adi,soyadi,numarasi):
        self.adi = adi
        self.soyadi = soyadi
        self.numarasi = numarasi


    def giris(self):
        print("Giriş Yapıldı")

    def cikis(self):
        print("Çıkış yapıldı")


class Personel:
    def __init__(self, adi, soyadi, numarasi):
        self.adi = adi
        self.soyadi = soyadi
        self.numarasi = numarasi

    def giris(self):
        print("Giriş Yapıldı")

    def cikis(self):
        print("Çıkış yapıldı")


class Ogrenci:
    def __init__(self, adi, soyadi, numarasi):
        self.adi = adi
        self.soyadi = soyadi
        self.numarasi = numarasi

    def giris(self):
        print("Giriş Yapıldı")

    def cikis(self):
        print("Çıkış yapıldı")

Fark ettiyseniz OOP kullanmamıza rağmen yine aynı kodları tekrar tekrar yazmak zorunda kaldık. Şimdi birde miras alma kavramı ile yapalım.

Görsele baktığımız  zaman Kullanıcı adında bir nesnemiz var  bu nesnenin akademisyen, personel ve öğrenci adında alt nesneleri var.  Kullanıcı nesnesinin özellikleri diğer tüm alt nesnelerde var. Yani bu alt nesneler ana nesne olan kullanıcı nesnesinden türemiş, diğer bir adıyla miras alınmış hemen kodlarını yazalım o zaman çok daha iyi anlayacaksınız.

Miras Alma Kullanımı

Miras alma yöntemi çok kolaydır. Genel kullanım şekli şu şekildedir.

Class sinif_adi(miras_alinacak_sinif_adi):

……….

 

Şimdi kodlarımızı yazalım;

class Kullanici:
    def __init__(self,adi,soyadi,numara):
        print("Kullanıcı sınıfı fonksyonu")
        self.adi = adi
        self.soyadi = soyadi
        self.numara = numara


    def giris(self):
        print("Giriş Yapıldı")

    def cikis(self):
        print("Çıkış yapıldı")



class Akademisyen(Kullanici):
    pass
class Personel(Kullanici):
    pass
class Ogrenci(Kullanici):
    pass

Kullanıcı isimli sınıfımızı oluşturduk ve diğer nesneleri bu sınıftan miras aldık. Alt sınıflar için özellik ve işlev eklemedik çünkü biz özellik ve işlevleri kullanıcı sınıfından miras alacağız hemen gösterelim;

Şimdi objeyi oluşturup çağıralım.

akademisyen = Akademisyen("Mustafa","Kaya",1236521)
personel = Personel("Mehmet","Yıldız",1539527)
ogrenci = Ogrenci("Can","Demir",1436589)

print("Akademisyen")
print(akademisyen.adi)
print(akademisyen.soyadi)
print(akademisyen.numara)

print("Personel")
print(personel.adi)
print(personel.soyadi)
print(personel.numara)

print("Öğrenci")
print(ogrenci.adi)
print(ogrenci.soyadi)
print(ogrenci.numara)

Çıktıya bakalım;

Akademisyen
Mustafa
Kaya
1236521

Personel
Mehmet
Yıldız
1539527

Öğrenci
Can
Demir
1436589

Gördüğünüz gibi kullanıcı nesnesindeki özellikleri ve işlevleri istediğiniz gibi çağırıp kullanabiliyorsunuz. Şimdi aklımıza bir de şu şekilde bir soru gelmiştir; ben miras aldığım nesnenin özelliklerini kullanabiliyorum ama ek özellik ve işlev eklemek istediğimde ne yapacağım. Bunun için yeni bir başlık atıyoruz.

Python Overriding

Overriding Türkçe karşılığı üstüne yazmak anlamına geliyor. Biz sınıfları işlediğimiz zaman yapıcı olan fonksiyon __init__() fonksiyonu için oluşturduğumuz sınıfın referansı demiştik ve bu fonksiyon otomatik olarak çalışıyordu. Onun için biz yeni sınıfımızda miras aldığımız fonksiyonun özelliklerini değil yeni özellikleri kullanmak istediğimiz zaman yeni sınıf için __init__() fonksiyonu tanımlamamız gerekiyor. Hemen gösterelim.

class Kullanici:
    def __init__(self,adi,soyadi,numara):
        print("Kullanıcı sınıfı fonksyonu")
        self.adi = adi
        self.soyadi = soyadi
        self.numara = numara


    def giris(self):
        print("Giriş Yapıldı")

    def cikis(self):
        print("Çıkış yapıldı")



class Akademisyen(Kullanici):
    def __init__(self,adi,soyadi,numara,dogum_tarihi):
        print("Akademisyen sınıfı fonksiyonu")
        self.adi= adi
        self.soyadi=soyadi
        self.numara= numara
        self.dugum_tarihi = dogum_tarihi

akademisyen = Akademisyen("Mustafa","Kaya",1236521,1997)
print(akademisyen.adi)
akademisyen.giris()

Kodumuzu çalıştıralım;

Akademisyen sınıfı fonksiyonu
Mustafa
Giriş Yapıldı

Şeklinde bir çıktı aldık. Biz artık Kullanıcı sınıfının __init__()  fonksiyonu değil akademisyen sınıfının __init__() fonksiyonunu kullanıyoruz. Ama Kullanıcının diğer işlevlerini yani fonksiyonlarını da kullanabiliyoruz. Şimdi siz diyeceksiniz  hani OOP ve miras alma(inheritance) kod tekrarını önlemek ve az kod yazmak için kullanıyorduk.

Kullanıcı içinde oluşturduğumuz özellikleri tekrar oluşturduk. Bunun için bir çözüm yok mu elbette var. Bunun için bir başlık atalım:)

super()

Türkçe karşılığı üst olan bu fonksiyon içinde bulunduğu sınıfın üst bir sınıftan miras alındığını ve oradaki özellikleri kullanabilmenizi sağlıyor.

Hemen gösterelim;

Genel kullanımı şu şekildedir;

super().__init__(ust_sinif_parametreleri)

Hemen örneğimizi yapalım;

class Kullanici:
    def __init__(self,adi,soyadi,numara):
        print("Kullanıcı sınıfı fonksiyonu")
        self.adi = adi
        self.soyadi = soyadi
        self.numara = numara


    def giris(self):
        print("Giriş Yapıldı")

    def cikis(self):
        print("Çıkış yapıldı")



class Akademisyen(Kullanici):
    def __init__(self,adi,soyadi,numara,dogum_tarihi):
        print("Akademisyen sınıfı fonksiyonu")
        super().__init__(adi,soyadi,numara)
        self.dugum_tarihi = dogum_tarihi

akademisyen = Akademisyen("Mustafa","Kaya",1236521,1997)

Burada yukarıda oluşturduğumuz ad,soyad ve numara özelliklerini tekrar oluşturmadık. super() fonksiyonu ile miras aldık.  kodları çalıştıralım;

Akademisyen sınıfı fonksiyonu
Kullanıcı sınıfı fonksiyonu

Gördüğünüz gibi hem kullanıcı sınıfının __init__() fonksiyonu çalıştı hem de Akademisyen sınıfının yapıcı metodu __init__() fonksiyonu çalıştı.

Mobilhanem.com da Python Inheritance(Miras Alma) dersinin  sonuna geldik bir sonraki yazıda görüşmek üzere eğer anlamadığınız eksik yada yanlış 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.

202

Cahit İşleyen

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

3 Yorum

Haftalık Bülten

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