{ "cells": [ { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "# Nesne Tabanlı Programlama - Sınıflar" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bu konuda artık kendi veri tiplerimizi ve objelerimizi üretmeye başlayacağız. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Kendi veri tiplerimizi oluşturmak ve bu veri tiplerinden objeler üretmemiz için öncelikle objeleri üreteceğimiz yapıyı tanımlamamız gerekiyor. Bunu tasarladığımız yapıya da **sınıf** veya ingilizce ismiyle **class diyoruz.** Şimdi class yapılarını öğrenerek konumuza başlayalım." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Class Anahtar Kelimesi\n", "\n", "**Sınıflar veya Classlar** objelerimizi oluştururken objelerin özelliklerini ve metodlarını tanımladığımız bir yapıdır ve biz herbir objeyi bu yapıya göre üretiriz. İsterseniz bir Araba **classı** tanımlayarak yapımızı kurmaya başlayalım.\n", "\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Yeni bir Araba veri tipi oluşturuyoruz.\n", "class Araba():\n", " model = \"Renault Megane\"\n", " renk = \"Gümüş\" # Sınıfımızın özellikleri (attributes)\n", " beygir_gücü = 110\n", " silindir = 4\n", " \n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sınıfımızı Pythonda tanımladık. Peki bu sınıftan obje nasıl oluşturacağız ? Bunu da şu şekilde yapabiliyoruz.\n", "\n", "**----------------------------------------------------------------------------------------------------------------------------**\n", "\n", " obje_ismi = Sınıf_İsmi(parametreler(opsiyonel))\n", " \n", "**----------------------------------------------------------------------------------------------------------------------------**" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": true }, "outputs": [], "source": [ "araba1 = Araba() # Araba veri tipinden bir \"araba1\" isminde bir obje oluşturduk." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "<__main__.Araba at 0x8b9f76f860>" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "araba1 # Objemizin veri tipi Araba" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "__main__.Araba" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(araba1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**araba1** objesi artık sınıfta tanımladığımız bütün özelliklere (attributes) sahip olmuş oldu. İşte sınıf ve obje üretmek bu şekilde olmaktadır. Peki bu araba objesinin özelliklerinin nasıl görebiliriz ? \n", "\n", "**--------------------------------------------------------------------------------------------------------------------------**\n", "\n", " obje_ismi.özellik_ismi\n", "**--------------------------------------------------------------------------------------------------------------------------**" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Renault Megane'" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "araba1.model" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Gümüş'" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "araba1.renk" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "110" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "araba1.beygir_gücü" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "araba1.silindir" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Şimdi de başka bir **Araba** objesi oluşturalım." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": true }, "outputs": [], "source": [ "araba2 = Araba()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Renault Megane'" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "araba2.model" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Gümüş'" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "araba2.renk" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "110" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "araba2.beygir_gücü" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "araba2.silindir" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Burda gördüğümüz gibi oluşturduğumuz **objelerin** buradaki model,renk vs. gibi özelliklerinin değeri **aynıdır.** Çünkü aslında burada tanımladığımız **özellikler** birer sınıf **özelliğidir.** Yani biz bir obje oluşturduğumuzda bu özelliklerin değerleri varsayılan olarak gelir. Bu özelliklerin değerlerine , herhangi bir **obje oluşturmadan** da erişebiliriz. Bunu da şu şekilde yapabiliriz." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Gümüş'" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Araba.renk # Class_İsmi.özellik_ismi" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "110" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Araba.beygir_gücü" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bizim her bir objeyi başlangıçta farklı değerlerle oluşturmamız için her bir objeyi oluştururken objelerin değerlerini göndermemiz gerekiyor. Bunun için de özel bir metodu kullanmamız gerekmektedir. \n", "**----------------------------------------------------------------------------------------------------------------------------**\n", " __init__() \n", "**----------------------------------------------------------------------------------------------------------------------------** \n", "\n", "Peki bu metod ne anlama geliyor ? İsterseniz ilk olarak ***dir()*** fonksiyonu yardımıyla **araba1** objemizde neler var bakalım." ] }, { "cell_type": "code", "execution_count": 32, "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", " 'beygir_gücü',\n", " 'model',\n", " 'renk',\n", " 'silindir']" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dir(araba1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Burada objemizin tüm özelliklerini ve metodlarını görüyoruz. Ancak biz herhangi bir metod tanımlamamıştır. Buradaki metodlar Python tarafından bir obje oluşturulduğunda özel olarak tanımlanan metodlardır ve biz eğer özel olarak bunları tanımlamazsak Python kendisi bunları varsayılan tanımlıyor. Burada aynı zamanda **init** metodunu da görüyoruz. Eğer biz bu metodu kendimiz tanımlarsak objelerimizi farklı değerlerle başlatabiliriz.\n", "\n", "\n", "Aslında **init** metodu Pythonda **yapıcı(constructor ) fonksiyon** olarak tanımlanmaktadır. Bu metod **objelerimiz oluşturulurken otomatik olarak ilk çağrılan fonksiyondur.** Bu metodu özel olarak tanımlayarak objelerimizi farklı değerlerle oluşturabiliriz.\n", "\n", "Peki bu metodu nasıl tanımlayacağız ? Direk örnek üzerinden görmeye çalışalım." ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Araba Veri tipi \n", "\n", "class Araba():\n", " # Şimdilik Class özelliklerine ihtiyacımız yok.\n", " \n", " def __init__(self):\n", " print(\"init fonksiyonu çağrıldı.\")\n", " " ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "init fonksiyonu çağrıldı.\n" ] } ], "source": [ "araba1 = Araba() # araba1 objesi oluşurken otomatik olarak __init__ metodumuz çağrılıyor." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Peki burada **self** ne anlama geliyor ? **self** anahtar kelimesi objeyi oluşturduğumuz zaman o objeyi gösteren bir referanstır ve metodlarımızda en başta bulunması gereken bir parametredir. Yani biz bir objenin bütün özelliklerini ve metodlarını bu referans üzerinden kullanabiliriz. \n", "\n", "**Objeler oluşturulurken, Python bu referansı metodlara otomatik olarak kendisi gönderir. Özel olarak self referansını göndermemize gerek yoktur.** \n", "\n", "\n", "**init metodunu ve self'i ** iyi anlamak için objelerimize özellikler ekleyelim." ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class Araba():\n", " \n", " def __init__(self,model,renk,beygir_gücü,silindir): # Parametrelerimizin değerlerini objelerimizi oluştururken göndereceğiz.\n", " self.model = model # self.özellik_ismi = parametre değeri şeklinde objemizin model özelliğine değeri atıyoruz.\n", " self.renk = renk # self.özellik_ismi = parametre değeri şeklinde objemizin renk özelliğine değeri atıyoruz.\n", " self.beygir_gücü = beygir_gücü # self.özellik_ismi = parametre değeri şeklinde objemizin beygir_gücü özelliğine değeri atıyoruz.\n", " self.silindir = silindir # self.özellik_ismi = parametre değeri şeklinde objemizin silndir özelliğine değeri atıyoruz." ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# araba1 objesini oluşturalım.\n", "# Artık değerlerimizi göndererek objelerimizin özelliklerini istediğimiz değerle başlatabiliriz.\n", "araba1 = Araba(\"Peugeot 301\",\"Beyaz\",90,4) " ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# araba2 objesini oluşturalım.\n", "araba2 = Araba(\"Renault Megane\",\"Gümüş\",110,4)" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Peugeot 301'" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "araba1.model" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Beyaz'" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "araba1.renk" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Renault Megane'" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "araba2.model" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Gümüş'" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "araba2.renk" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**İstersek init metodunu varsayılan değerlerle de yazabiliriz.**" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class Araba():\n", " \n", " def __init__(self , model = \"Bilgi Yok\",renk = \"Bilgi Yok\",beygir_gücü = 75 ,silindir = 4): \n", " self.model = model \n", " self.renk = renk \n", " self.beygir_gücü = beygir_gücü \n", " self.silindir = silindir" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": true }, "outputs": [], "source": [ "araba1 = Araba(beygir_gücü = 85, renk = \"Siyah\")" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Siyah'" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "araba1.renk" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Bilgi Yok'" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "araba1.model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "İşte burada gördüğümüz gibi bir objeyi **init** metodunu kendimiz yazarak farklı değerlerle oluşturabiliyoruz. Bir sonraki derste objelere kendi metodlarımızı nasıl yazacağımızı öğrenmeye çalışacağı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 }