python dersleri

Python Nesne Tabanlı Programlama (OOP)

Merhaba Arkadaşlar,
Mobilhanem.com da Python Eğitimi Serisinin bu yazısında hepinizin merakla beklediği, Python Nesne Tabanlı Programlama’ya (OOP) ile birlikteyiz. Baya bir yol aldık ve artık başlangıç seviye Python Dersleri serisinin sonlarına yaklaştık.
Bu derste nesne tabanlı programlamanın ne olduğunu, python da nesne tabanlı programlama kavramını  ve Python da kendi nesnelerimizi oluşturmayı öğrenmiş olacağız.

Python Nesne Tabanlı Programlama ve Neden Nesne Tabalı Programlama

Eminim aklınızda neden nesne tabanlı programlama? nesne tabanlı programlamayı bilmek zorunda mıyım? Gibi sorular vardır. O zaman cevaplayalım.
Nesne tabanlı programlama bilmek zorunda değilsiniz. Özellikle Python da nesne tabanlı programlama bilmeden de çok güzel işler yapabilirsiniz. Python sizi nesne tabanlı programlama kullanmaya zorlamaz.

Peki o zaman neden nesne tabanlı programlama öğreniyorum diyeceksiniz. Şimdi size nesne tabanlı programlama neden kullanmanız gerektiğini anlattığım da o zaman aslında nesne tabanlı programlamayı bilmenin bir zorunluluk olduğunu göreceksiniz. Hemen moralimizi bozmayalım. Çünkü Python da nesne tabanlı programlama çok basit hele ki diğer programlama dilleri ile karşılaştırdığınız zaman. İlk defa nesne tabanlı programlamayı öğreniyorsanız Python ile öğrendiğiniz için çok şanslısınız. O zaman neden nesne tabanlı programlama sorusuna? Cevap verelim.

  • Nesne tabanlı programlama ile yazılmış bir kodu okumak ve ne olduğunu anlamak için öğrenmelisiniz.
  • Çok büyük projelerle karşılaştığınız zaman işleri bölmek zorunda kaldığınız zaman kullanmak zorunda olacaksınız.
  • Son olarak iyi bir yazılımcı olmak istiyorsanız kesinlikle bilmek zorundasınız. Çünkü kod yazmak kadar okunabilir ve verimli kod yazmak da bir o kadar önemli.

Bu sayede nesne  tabanlı programlama ile yazdığınız kodlar;

  • Okunabilir kodlar
  • Modülerlik iş parçacıklarına bölme
  • Kodları değiştirmede kolaylık
  • Projeyi daha kolay geliştirme ve genişletme
  • Kodların bakımı çok daha kolay
  • Modüllere ayırdığınız için kodları tekrar başka bir projede ekleme ve kullanabilme kolaylığı.

Öğrenmeye karar verdiyseniz o zaman başlayalım.

Nesne Tabanlı Programlama Nedir?

Nesne tabanlı programlama bir yazılım geliştirme yöntemidir. Nesne tabanlı programlama gerçek hayatın yazılıma uyarlanmış halidir. Nasıl mı? Şöyle bir etrafımıza baktığımız zaman etrafımız da birçok nesne var. Çokta uzağa gitmeye gerek yok şu an bu yazıyı okurken kullandığınız; bilgisayar, telefon veya tablet bir nesne. Bu nesnelerin bazı özellikleri ve işlevleri var. Örneğin bilgisayarınızın rengi, işlemci hızı ve markası bilgisayarın bazı özellikleri. Aynı zamanda bilgisayarın açma/kapatma düğmesi, tuşları vs. bu bilgisayarın bazı işleri yerine getirmesini sağlayan işlevlerdir.

İşte bizde bilgisayar nesnesi gibi nesneler oluşturacağız. Bu nesnelere bazı özellikler vereceğiz. Aynı zamanda bu nesnelere bazı işlemler yaptıracağız. Şimdi gerçek hayatta ki nesneler ile yazılım da oluşturduğumuz nesneleri karşılaştıralım.
Biz bir nesnenin özellikleri olduğunu söylemiştik peki bizim oluşturduğumuz nesnelerin özellikleri nedir? Bizim oluşturduğumuz nesnenin veri tipleri, operatörler vb. bizim nesnenin özellikleri olacak. Peki işlevlerini nasıl oluşturacağız? Nesnenin işlevlerini ise; fonksiyon veya metotlar yardımıyla oluşturacağız. Tamam çok güzel nesnenin ne olduğunu öğrendik peki nesneleri nasıl oluşturacağız? O zaman bir başlık atalım.

Sınıf(class)

Evet nesnelerimizi sınıflar yardımı ile oluşturacağız. Peki sınıf nedir? Daha önce ki derslerimizde bazı veri tiplerini görmüştük. Örneğin listeler, demetler, sözlükler vb. işte sınıflarda bu veri türleri gibi Python da bir veri türüdür.
Sınıflar ortak özelliklere sahip gurup ve ya kümeleri tanımlamak için kullanılır. Örneğin bütün arabaların bir markası, modeli, fiyatı, rengi vb. gibi özellikleri vardır.

Daha önce öğrendiğimiz veri türlerine bakalım;

print(type(list))
print(type(str))
print(type(tuple))
print(type(int))
print(type(dict))

<class 'type'>
<class 'type'>
<class 'type'>
<class 'type'>
<class 'type'>

Gördüğünüz bu veri türlerinin bir sınıf tipi olduğunu bize gösterdi. O zaman hemen bir sınıf oluşturalım.
Bunun için Python da class anahtar kelimesini kullanacağız. Ve genel sınıf oluşturma taslağımız bu şekildedir.

class sinif_adi():
……..

Veya

class sinif_adi:
…..

İki farklı şekilde oluşturabilirsiniz ama ilerde işleyeceğimiz kalıtım konusunda parantezli şekilde kullanmak zorunda olduğumuzu göreceksiniz.
Ama kalıtım kullanılmadığı durumlarda genellikle bu yapı kullanılır;

Class sinif_adi:
…..

Nasıl sınıf oluşturulur öğrendik şimdi bir sınıf oluşturalım ben bunun için en basitinden bir araba sınıfı oluşturuyorum.

class Araba:
    pass

Sınıfımızı oluşturduk şimdilik bir özellik veya işlevi olmadığı için pass anahtar kelimesi ile boş olduğunu gösterdim.
O zaman bu sınıfa bazı özellikler verelim. Bunun için bir başlık atalım.

Sınıf Nitelikleri

Örneğin renk, marka, model vb. bir sınıfın nitelikleridir.

class Araba:
    marka = ""
    renk = ""
    plaka = ""

Sınıfımızı oluşturmuş olduk. Peki nesne nasıl oluşturacağız? Biz dersin başında nesneleri sınıflar yardımıyla oluşturacağımızı söylemiştik. O zaman oluşturduğumuz. Sınıftan bir nesne türetelim(oluşturalım.)

class Araba:
    marka = ""
    renk = ""
    plaka =""

#sınıftan bir nesne türetiyoruz
araba1 = Araba()
araba1.marka ="FORD"
araba1.renk ="Siyah"
araba1.plaka ="34 P 148"

Evet gördüğünüz gibi bir sınıftan nesne oluşturduk ve bu nesnenin özelliklerini atadık.

Sınıf ile Nesne(Object) arasında ki fark nedir?

Buraya çok iyi dikkat edin. Bizim oluşturduğumuz Araba() sınıfı bir genel kavram. Şöyle anlatalım bütün arabaların bir markası, modeli veya bir rengi var. Yani genel bir sınıflandırma yapıyoruz. Ama siz bu arabanın rengini, markasını, modelini bilemezsiniz. Çünkü Araba() sınıfı bir soyut kavram. Bu yüzden soyut bir kavramın özelliklerini bilemezsiniz. Ama eğer rengi beyaz, modeli ford gibi özelliklerini belirttiğiniz zaman siz o sınıfı somutlaştırmış bir nesne(object) oluşturmuş olursunuz.

Şimdi oluşturduğumuz sınıftan bir nesne(object) daha oluşturalım.

class Araba:
    marka = ""
    renk = ""
    plaka =""

araba1 = Araba()
araba1.marka ="FORD"
araba1.renk ="Siyah"
araba1.plaka ="34 P 148"

araba2 = Araba()

araba2.marka ="BMW"
araba2.renk ="Beyaz"
araba2.plaka ="04 GH 48"

print("-------ARABA 1------")
print("Marka: {} \nRenk :{}\nPlaka :{}".format(araba1.marka,araba1.renk,araba1.plaka))

print("-------ARABA 2------")
print("Marka: {} \nRenk :{}\nPlaka :{}".format(araba2.marka,araba2.renk,araba2.plaka))

Şimdi çıktıyı görelim.

-------ARABA 1------
Marka: FORD
Renk :Siyah
Plaka :34 P 148
-------ARABA 2------
Marka: BMW
Renk :Beyaz
Plaka :04 GH 48

Gördüğünüz gibi arkadaşlar bir sınıftan birden fazla nesne oluşturabilirsiniz. Zaten Nesne tabanlı programlamanın amacı da bu, bir defa yaz çok defa kullan.
Sınıfı oluşturduk ve bu sınıfa bazı özellikler verdik. Dersin başında nesne kavramını anlatırken belli özellikleri ve işlevleri olduğunu söylemiştik. Şimdi sınıflarımıza bazı işlevler verelim örneğin; arabanın hızlanması, çalışması vs. o nesnenin bazı işlevleridir.
O zaman bizde arabamıza hız işlevlerini ekleyelim.

def hizArttir(self):
    self.hiz +=10
    return self.hiz

Nesnenin hız işlevini oluşturduk. Burada daha önce hiç bahsetmediğimiz self anahtar kelimesi var.

self

Peki bu anahtar kelime ne işe yarıyor? Bu anahtar kelime oluşturduğumuz, fonksiyonun veya özelliğin referans olarak gösterir. Şu şekilde düşünebilirsiniz, siz dışarıdan bu fonksiyona ve ya özelliğe ulaşmaya çalıştığınız zaman bu anahtar kelime sayesinde ulaşabiliyorsunuz.
Ve sınıf içinde oluşturduğunuz her fonksiyonun ilk parametresi self anahtar kelimesi olmak zorundadır. Daha detaylı bilgi için buraya bakabilirsiniz. Şimdi oluşturduğumuz fonksiyonu çağıralım.

araba.hizArttir()

Şimdi diyeceksiniz self parametresini başta oluştururken fonksiyona eklediniz ama çağırırken vermediniz. Bir önceki derslerde fonksiyonları anlatırken bu şekilde anlatmamıştınız diyeceksiniz. Çağırırken self parametresi vermedik çünkü Python otomatik ekliyor. Sizin eklemenize gerek yok 🙂
O zaman kodlarımızın tamamını yazalım.

class Araba:
    marka = ""
    renk = ""
    plaka =""
    hiz = 0

    def hizArttir(self):
        self.hiz +=10
        return self.hiz

araba = Araba()
araba.marka ="FORD"
araba.renk ="Siyah"
araba.plaka ="34 P 148"

print("-------ARABA ------")
print("Marka: {} \nRenk :{}\nPlaka :{}".format(araba.marka,araba.renk,araba.plaka))
araba.hizArttir()
print("Hız :",araba.hiz)

Çıktımız şu şekilde olacaktır;

-------ARABA ------
Marka: FORD
Renk :Siyah
Plaka :34 P 148
Hız : 10

Eğer fonksiyonu ne kadar çağırsak fonksiyonu o kadar çalıştırmış oluruz.

araba.hizArttir()
araba.hizArttir()
araba.hizArttir()
araba.hizArttir()
araba.hizArttir()

Çıktımız;

-------ARABA ------
Marka: FORD
Renk :Siyah
Plaka :34 P 148
Hız : 50

Çok güzel artık kendi nesnemizi oluşturabiliyoruz, nesnelerimize özellik ve işlev verebiliyoruz. Şimdi nesnelerimizi biraz daha düzenleyelim. Örneğin biz sonradan nesnelere özellik verdik. Nesnemizi oluştururken özellik verebiliyor muyuz? Ona bakalım;

class Araba:
    marka = "FORD"
    renk = "KIRMIZI"
    plaka ="34 GH 100"
    hiz = 20


araba = Araba()

print("-------ARABA ------")
print("Marka: {} \nRenk :{}\nPlaka :{}".format(araba.marka,araba.renk,araba.plaka))

 

Hemen çıktıya bakalım;

-------ARABA ------

Marka: FORD

Renk :KIRMIZI

Plaka :34 GH 100

Gördüğünüz gibi nesne tanımladığımız yani oluşturduğumuz zamanda nesneye özellik verebiliyoruz. Yalnız bir sorunumuz var. Hemen gösterelim;

class Araba:
    marka = "FORD"
    renk = "KIRMIZI"
    plaka ="34 GH 100"
    hiz = 20


araba = Araba()
araba2 = Araba()
print("-------ARABA 1 ------")
print("Marka: {} \nRenk :{}\nPlaka :{}".format(araba.marka,araba.renk,araba.plaka))

print("-------ARABA 2 ------")
print("Marka: {} \nRenk :{}\nPlaka :{}".format(araba2.marka,araba2.renk,araba2.plaka))

Çıktıya bakalım;

-------ARABA 1 ------
Marka: FORD
Renk :KIRMIZI
Plaka :34 GH 100
-------ARABA 2 ------
Marka: FORD
Renk :KIRMIZI
Plaka :34 GH 100

Gördüğünüz gibi iki nesne de aynı özelliklere sahip peki farklı türde nesne nasıl oluşturabiliriz? Yeni bir başlık atıyoruz.

Python __init__() Fonksiyonu:

Peki bu fonksiyon nedir? Bu fonksiyon Python yapıcı fonksiyonudur. Yapıcı fonksiyon nedir? Yapıcı fonksiyon Python nesne oluşturulduğunda  default olarak çalıştırılan fonksiyondur. Az önce size self anahtar kelimesini anlatırken  şu şekilde bir tanım yapmıştık: “Bu anahtar kelime oluşturduğumuz, fonksiyonun veya özelliğin referans olarak gösterir. ” aynı şekilde siz __init__() fonksiyonunu içinde akılda kalması için Python’nun referans anahtar kelimesi olarak aklınızda tutabilirsiniz.

Hemen bir örnekle gösterelim o zaman çok daha iyi anlayacaksınız.

class Araba:
    def __init__(self):
        print("Yapıcı fonksiyon __init__() fonksiyonu çalıştı...")


araba = Araba()

Çıktıya bakalım:

Yapıcı fonksiyon __init__() fonksiyonu çalıştı...

Gördüğünüz gibi biz fonksiyonu çağırmadık. Hatırlarsanız biz  hizArttir() fonksiyonu oluşturmuştuk. ve fonksiyonu çağırmak için şöyle yapmıştık:

araba.hizArttir()

Ama  __init__() fonksiyonu için yapmadık çünkü biz tanımlarken fonksiyonu otomatik olarak çalıştırılan fonksiyon demiştik. Bu yüzden programı çalıştırdığımız zaman otomatik olarak bu fonksiyon çalıştı.

Şimdi __init__() fonksiyonunu kullanalım;

class Araba:
    def __init__(self,marka,renk,plaka,hiz):
        self.marka = marka
        self.renk = renk
        self.plaka = plaka
        self.hiz = hiz



araba1 = Araba("Fiyat","Mavi","25 P 45",30)
araba2 = Araba("Ford","Beyaz","14 YH 566",100)
print("------Araba 1 ------")
print(araba1.marka)
print(araba1.renk)
print(araba1.plaka)
print(araba1.hiz)
print()
print()
print("-----Araba 2 -------")
print(araba2.marka)
print(araba2.renk)
print(araba2.plaka)
print(araba2.hiz)

Çıktıya bakalım;

------Araba 1 ------
Fiyat
Mavi
25 P 45
30


-----Araba 2 -------
Ford
Beyaz
14 YH 566
100

Güzel peki burada default olarak değer verebiliyor muyuz? Hemen bir örnekle göstereyim;

class Araba:
    def __init__(self,marka="Fiyat",renk="Mavi",plaka="25 P 45",hiz=30):
        self.marka = marka
        self.renk = renk
        self.plaka = plaka
        self.hiz = hiz



araba1 = Araba()
print("------Araba 1 ------")
print(araba1.marka)
print(araba1.renk)
print(araba1.plaka)
print(araba1.hiz)

Çıktıya bakalım ;

------Araba 1 ------
Fiyat
Mavi
25 P 45
30

Peki ikinci bir nesne oluşturduğumuzda yine aynı özelliklere mi sahip olacak diyorsanız. Şöyle bir örnek verelim:

class Araba:
    def __init__(self,marka="Fiyat",renk="Beyaz",plaka="25 P 45",hiz=30):
        self.marka = marka
        self.renk = renk
        self.plaka = plaka
        self.hiz = hiz



araba1 = Araba()
araba2 = Araba("Ford","Beyaz","14 YH 566",100)
print("------Araba 1 ------")
print(araba1.marka)
print(araba1.renk)
print(araba1.plaka)
print(araba1.hiz)
print()
print()
print("-----Araba 2 -------")
print(araba2.marka)
print(araba2.renk)
print(araba2.plaka)
print(araba2.hiz)

Çıktıya bakalım;

------Araba 1 ------
Fiyat
Beyaz
25 P 45
30


-----Araba 2 -------
Ford
Beyaz
14 YH 566
100

Gördüğünüz gibi iki objede farklı.

Default olarak değer verebiliyoruz. Peki hepsine default değer vermek istemiyorum ben istediğim değeri default değer vermek istiyorum diyorsan o zaman şöyle bir örnek gösterelim.

class Araba:
    def __init__(self,marka="Fiyat",renk=None,plaka="25 P 45",hiz=30):
        self.marka = marka
        self.renk = renk
        self.plaka = plaka
        self.hiz = hiz



araba1 = Araba(renk="Beyaz")
araba2 = Araba("Ford","Beyaz","14 YH 566",100)
print("------Araba 1 ------")
print(araba1.marka)
print(araba1.renk)
print(araba1.plaka)
print(araba1.hiz)

Çıktıya bakalım;

------Araba 1 ------
Fiyat
Beyaz
25 P 45
30

Gördüğünüz gibi default değer vermek istemediğimiz özellikler için None anahtar değerini veriyoruz. Biz burada None ile boş değer verdiğimizi sonradan değer ekleyeceğimizi söylüyoruz.

 

Mobilhanem.com da Pyhon Nesne Tabanlı Programlama(OOP) dersinin  sonuna geldik bir sonraki yazımızda aynı konu ile devam edeceğiz. Eksik ve ya yanlış gördüğünüz ya da anlamadığınız yerler için çekinmeden ulaşabilirsiniz.

Bütün Python derslerine buradan ulaşabilirsiniz.

148

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?