{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Nesne Tabanlı Programlama - Kalıtım (Inheritance)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bu konuda **Nesne Tabanlı Programlamadaki** inheritance(kalıtım veya miras alma) konseptini öğrenmeye çalışacağız. Inheritance veya kalıtım bir sınıfın başka bir sınıftan özelliklerini(**attribute** ) ve metodlarını miras almasıdır.\n", "\n", "\n", "Bu konsepti aslında bizim kendi anne babamızdan değişik özellikleri ve davranışları miras almamıza benzetebiliriz.(Hani derler ya ! Babasına çekmiş :) )\n", "\n", "Peki inheritance nerede işimize yarar ? Örneğin, bir şirketin çalışanlarını tasarlamak için sınıflar oluşturuyoruz. Bunun için Yönetici, Proje Direktörü, İşçi gibi sınıflar oluşturmamız gerekiyor. Aslında baktığımız zaman bu sınıfların hepsinin belli ortak metodları ve özellikleri bulunuyor. O zaman bu ortak özellikleri ve metodları tekrar tekrar bu sınıfların içinde tanımlamak yerine, bir tane ana class tanımlayıp bu classların bu classın özelliklerini ve metodlarını almalarını sağlayabiliriz. **Inheritance'ın veya Kalıtım'ın** temel mantığı budur.\n", "\n", "İsterseniz inheritance yapısını kurmak için öncelikle bir tane çalışan sınıfı oluşturalım. \n" ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class Çalışan():\n", " def __init__(self,isim,maaş,departman):\n", " print(\"Çalışan sınıfının init fonksiyonu\")\n", " self.isim = isim\n", " self.maaş = maaş\n", " self.departman = departman\n", " def bilgilerigoster(self):\n", " \n", " print(\"Çalışan sınıfının bilgileri.....\")\n", " \n", " print(\"İsim : {} \\nMaaş: {} \\nDepartman: {}\\n\".format(self.isim,self.maaş,self.departman))\n", " def departman_degistir(self,yeni_departman):\n", " print(\"Departman değişiyor....\")\n", " self.departman = yeni_departman\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Çalışan sınıfını oluşturduk şimdi de Yönetici sınıfını bu Çalışan sınıfından türetmeye çalışalım." ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class Yönetici(Çalışan): # Çalışan sınıfından miras alıyoruz.\n", " pass # Pass Deyimi bir bloğu sonradan tanımlamak istediğimizde kullanılan bir deyimdir." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Burada, yönetici sınıfında herhangi bir şey tanımlamadık ancak Çalışan sınıfından bütün özellikleri ve metodları miras aldık. Bakalım burada Çalışan sınıfının metodlarını kullanabilecek miyiz ?" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Çalışan sınıfının init fonksiyonu\n" ] } ], "source": [ "yönetici1 = Yönetici(\"Mehmet Baltacı\",3000,\"İnsan Kaynakları\") # yönetici objesi" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Çalışan sınıfının bilgileri.....\n", "İsim : Mehmet Baltacı \n", "Maaş: 3000 \n", "Departman: İnsan Kaynakları\n", "\n" ] } ], "source": [ "yönetici1.bilgilerigoster()" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Departman değişiyor....\n" ] } ], "source": [ "yönetici1.departman_degistir(\"Halkla İlişkiler\")" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Çalışan sınıfının bilgileri.....\n", "İsim : Mehmet Baltacı \n", "Maaş: 3000 \n", "Departman: Halkla İlişkiler\n", "\n" ] } ], "source": [ "yönetici1.bilgilerigoster()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Burada gördüğümüz gibi bütün özellikleri ve metodları Çalışan sınıfından miras aldığımız için kullanabiliyoruz. Bunu ***dir()*** fonksiyonu ile de görebiliriz." ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['__class__',\n", " '__delattr__',\n", " '__dict__',\n", " '__dir__',\n", " '__doc__',\n", " '__eq__',\n", " '__format__',\n", " '__ge__',\n", " '__getattribute__',\n", " '__gt__',\n", " '__hash__',\n", " '__init__',\n", " '__init_subclass__',\n", " '__le__',\n", " '__lt__',\n", " '__module__',\n", " '__ne__',\n", " '__new__',\n", " '__reduce__',\n", " '__reduce_ex__',\n", " '__repr__',\n", " '__setattr__',\n", " '__sizeof__',\n", " '__str__',\n", " '__subclasshook__',\n", " '__weakref__',\n", " 'bilgilerigoster',\n", " 'departman',\n", " 'departman_degistir',\n", " 'isim',\n", " 'maaş']" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dir(yönetici1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Peki biz Yönetici sınıfına ekstra fonksiyonlar ve özellikler ekleyebiliyor muyuz ? Örnek olması açısından **zam_yap** isimli bir metod ekleyelim." ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class Yönetici(Çalışan):\n", " def zam_yap(self,zam_miktarı):\n", " print(\"Maaşa zam yapılıyor....\")\n", " self.maaş += zam_miktarı " ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Çalışan sınıfının init fonksiyonu\n" ] } ], "source": [ "yönetici2 = Yönetici(\"Mustafa Murat Coşkun\",3000,\"Bilişim\") # yönetici objesi" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Çalışan sınıfının bilgileri.....\n", "İsim : Mustafa Murat Coşkun \n", "Maaş: 3000 \n", "Departman: Bilişim\n", "\n" ] } ], "source": [ "yönetici2.bilgilerigoster()" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Maaşa zam yapılıyor....\n" ] } ], "source": [ "yönetici2.zam_yap(500) # Ekstra eklediğimiz fonksiyonu da kullanabiliyoruz." ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Çalışan sınıfının bilgileri.....\n", "İsim : Mustafa Murat Coşkun \n", "Maaş: 3500 \n", "Departman: Bilişim\n", "\n" ] } ], "source": [ "yönetici2.bilgilerigoster()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "İşte biz bir sınıftan miras alarak oluşturduğumuz sınıflara ekstra metodlar ve özellikler de ekleyebiliyoruz." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Overriding (İptal Etme)\n", "\n", "Eğer biz miras aldığımız metodları **aynı isimle** kendi sınıfımızda tekrar tanımlarsak , artık metodu çağırdığımız zaman **miras aldığımız değil kendi metodumuz çalışacaktır.** Buna Nesne Tabanlı Programlamada bir metodu override etmek denmektedir.\n", "\n", "Örneğin artık Çalışan sınıfının **init** metodunu kullanmak yerine Yönetici sınıfında **init** metodunu override edebiliriz. Böylelikle Yönetici sınıfına ekstra özellikler(**attribute**) ekleyebiliriz." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class Çalışan():\n", " def __init__(self,isim,maaş,departman):\n", " print(\"Çalışan sınıfının init fonksiyonu\")\n", " self.isim = isim\n", " self.maaş = maaş\n", " self.departman = departman\n", " def bilgilerigoster(self):\n", " \n", " print(\"Çalışan sınıfının bilgileri.....\")\n", " \n", " print(\"İsim : {} \\nMaaş: {} \\nDepartman: {}\\n\".format(self.isim,self.maaş,self.departman))\n", " def departman_degistir(self,yeni_departman):\n", " print(\"Departman değişiyor....\")\n", " self.departman = yeni_departman" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class Yönetici(Çalışan):\n", " \n", " def __init__(self,isim,maaş,departman,kişi_sayısı): # Sorumlu olduğu kişi sayısı\n", " print(\"Yönetici sınıfının init fonksiyonu\")\n", " self.isim = isim\n", " self.maaş = maaş\n", " self.departman = departman\n", " self.kişi_sayısı = kişi_sayısı # Yeni eklenen özellik\n", " def zam_yap(self,zam_miktarı):\n", " print(\"Maaşa zam yapılıyor....\")\n", " self.maaş += zam_miktarı" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Yönetici sınıfının init fonksiyonu\n" ] } ], "source": [ "a = Yönetici(\"Mustafa Murat Coşkun\",3000,\"Bilişim\",10) # Yönetici sınıfının init fonksiyonu. Override edildi." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "İsterseniz şimdi de **bilgilerigoster** metodunu override edelim." ] }, { "cell_type": "code", "execution_count": 86, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class Çalışan():\n", " def __init__(self,isim,maaş,departman):\n", " print(\"Çalışan sınıfının init fonksiyonu\")\n", " self.isim = isim\n", " self.maaş = maaş\n", " self.departman = departman\n", " def bilgilerigoster(self):\n", " \n", " print(\"Çalışan sınıfının bilgileri.....\")\n", " \n", " print(\"İsim : {} \\nMaaş: {} \\nDepartman: {}\\n\".format(self.isim,self.maaş,self.departman))\n", " def departman_degistir(self,yeni_departman):\n", " print(\"Departman değişiyor....\")\n", " self.departman = yeni_departman" ] }, { "cell_type": "code", "execution_count": 90, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class Yönetici(Çalışan):\n", " \n", " def __init__(self,isim,maaş,departman,kişi_sayısı): # Sorumlu olduğu kişi sayısı\n", " print(\"Yönetici sınıfının init fonksiyonu\")\n", " self.isim = isim\n", " self.maaş = maaş\n", " self.departman = departman\n", " self.kişi_sayısı = kişi_sayısı # Yeni eklenen özellik\n", " def bilgilerigoster(self):\n", " \n", " print(\"Yönetici sınıfının bilgileri.....\")\n", " \n", " print(\"İsim : {} \\nMaaş: {} \\nDepartman: {}\\nSorumlu kişi sayısı: {}\".format(self.isim,self.maaş,self.departman,self.kişi_sayısı))\n", " def zam_yap(self,zam_miktarı):\n", " print(\"Maaşa zam yapılıyor....\")\n", " self.maaş += zam_miktarı" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Yönetici sınıfının init fonksiyonu\n" ] } ], "source": [ "b = Yönetici(\"Serhat Say\",2500,\"Pazarlama\",5)" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Yönetici sınıfının bilgileri.....\n", "İsim : Serhat Say \n", "Maaş: 2500 \n", "Departman: Pazarlama\n", "Sorumlu kişi sayısı: 5\n" ] } ], "source": [ "b.bilgilerigoster() # Kendi yazdığımız fonksiyon çağrıldı. Overriding" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### super Anahtar Kelimesi" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**super** anahtar kelimesi özellikle override ettiğimiz bir metodun içinde aynı zamanda miras aldığımız bir metodu kullanmak istersek kullanılabilir. Yani **super** en genel anlamıyla miras aldığımız sınıfın metodlarını alt sınıflardan kullanmamızı sağlar. Hemen örnek üzerinden anlamaya çalışalım." ] }, { "cell_type": "code", "execution_count": 99, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class Çalışan():\n", " def __init__(self,isim,maaş,departman):\n", " print(\"Çalışan sınıfının init fonksiyonu\")\n", " self.isim = isim\n", " self.maaş = maaş\n", " self.departman = departman\n", " def bilgilerigoster(self):\n", " \n", " print(\"Çalışan sınıfının bilgileri.....\")\n", " \n", " print(\"İsim : {} \\nMaaş: {} \\nDepartman: {}\\n\".format(self.isim,self.maaş,self.departman))\n", " def departman_degistir(self,yeni_departman):\n", " print(\"Departman değişiyor....\")\n", " self.departman = yeni_departman" ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class Yönetici(Çalışan):\n", " \n", " def __init__(self,isim,maaş,departman,kişi_sayısı): # Sorumlu olduğu kişi sayısı\n", " super().__init__(isim,maaş,departman) # 3 tane özelliği Çalışan fonksiyonunun init fonksiyonuyla hallediyoruz.\n", " \n", " print(\"Yönetici sınıfının init fonksiyonu\")\n", " \n", " self.kişi_sayısı = kişi_sayısı # Ekstra özelliği de kendimiz yazıyoruz.\n", " def bilgilerigoster(self):\n", " \n", " print(\"Yönetici sınıfının bilgileri.....\")\n", " \n", " print(\"İsim : {} \\nMaaş: {} \\nDepartman: {}\\nSorumlu kişi sayısı: {}\".format(self.isim,self.maaş,self.departman,self.kişi_sayısı))\n", " def zam_yap(self,zam_miktarı):\n", " print(\"Maaşa zam yapılıyor....\")\n", " self.maaş += zam_miktarı" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Burada **super().__init()** diyerek Çalışan sınıfının metodunu **özel olarak çağırarak** isim, maaş , departman özelliklerini bu metodla belirledik." ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Çalışan sınıfının init fonksiyonu\n", "Yönetici sınıfının init fonksiyonu\n" ] } ], "source": [ "c = Yönetici(\"Oğuz Artıran\",3000,\"İnsan Kaynakları\",4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "İşte inheritance konusu bu kadar ! İlk başlarda karışık gelmiş gibi görünebilir. Ancak bu yapıları kullana kullana alışacaksınız." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" } }, "nbformat": 4, "nbformat_minor": 2 }